谁能给我一个上位机控制下位机的串口通信程序(C语言编写吧) 实现上位机和下位机串口通信,rs232接口,程序是要有两个吗

\u4e32\u53e3\u901a\u4fe1\uff1a\u4e0a\u4f4d\u673a\u63a7\u5236\u4e0b\u4f4d\u673a\u7684\u6c47\u7f16\u7a0b\u5e8f

\u5446\u5446\u5730

\u9996\u5148\uff0c\u4f60\u9700\u8981\u5236\u5b9a\u4e00\u4e2a\u901a\u8baf\u534f\u8bae\uff0c\u4e5f\u5c31\u662f\u4e0a\u4f4d\u673a\u53d1\u9001\u4ec0\u4e48\u5b57\u8282\u6216\u8005\u5b57\u7b26\uff0c\u4e0b\u4f4d\u673a\u5e94\u8be5\u6267\u884c\u4ec0\u4e48\u6837\u7684\u547d\u4ee4\u3002\u6709\u4e86\u901a\u8baf\u534f\u8bae\u4e4b\u540e\uff0c\u518d\u5206\u522b\u6839\u636e\u534f\u8bae\u6765\u7f16\u5199\u4e0a\u4f4d\u673a\u548c\u4e0b\u4f4d\u673a\u5c31\u53ef\u4ee5\u4e86\u3002

#include "stdafx.h"
#include "CommWizard.h"
#include "CommWizardDlg.h"
#include "SettingDlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About

class CAboutDlg : public CDialog
{
public:
CAboutDlg();

// Dialog Data
//{{AFX_DATA(CAboutDlg)
enum { IDD = IDD_ABOUTBOX };
//}}AFX_DATA

// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CAboutDlg)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL

// Implementation
protected:
//{{AFX_MSG(CAboutDlg)
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};

CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
//{{AFX_DATA_INIT(CAboutDlg)
//}}AFX_DATA_INIT
}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CAboutDlg)
//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
//{{AFX_MSG_MAP(CAboutDlg)
// No message handlers
//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CCommWizardDlg dialog

CCommWizardDlg::CCommWizardDlg(CWnd* pParent /*=NULL*/)
: CDialog(CCommWizardDlg::IDD, pParent)
{
bSend = FALSE;
bReceive = FALSE;

m_nPort = 1;
m_strSettings = _T("9600,n,8,1");
m_strSendString = _T("");
m_nTime = 1000;

m_nInputMode = 1;

//{{AFX_DATA_INIT(CCommWizardDlg)
m_strReceive = _T("");
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CCommWizardDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CCommWizardDlg)
DDX_Control(pDX, IDC_RECEIVE, m_ctrlReceive);
DDX_Control(pDX, IDC_SEND, m_ctrlSend);
DDX_Control(pDX, IDC_TYPE, m_ctrlDataType);
DDX_Text(pDX, IDC_EDIT_RECEIVE, m_strReceive);
DDX_Control(pDX, IDC_COMMCTRL, m_Com);
//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CCommWizardDlg, CDialog)
//{{AFX_MSG_MAP(CCommWizardDlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_RECEIVE, OnReceive)
ON_BN_CLICKED(IDC_SEND, OnSend)
ON_BN_CLICKED(IDC_SETTINGS, OnSettings)
ON_CBN_SELCHANGE(IDC_TYPE, OnSelchangeType)
ON_BN_CLICKED(IDC_CLEAR, OnClear)
ON_BN_CLICKED(IDC_MANUALSEND, OnManualsend)
ON_WM_TIMER()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CCommWizardDlg message handlers

BOOL CCommWizardDlg::OnInitDialog()
{
CDialog::OnInitDialog();

// Add "About..." menu item to system menu.

// IDM_ABOUTBOX must be in the system command range.
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);

CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
CString strAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}

// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon

// TODO: Add extra initialization here
m_ctrlDataType.AddString(_T("按ASCII码"));
m_ctrlDataType.AddString(_T("按2进制"));
m_ctrlDataType.AddString(_T("按16进制"));
m_ctrlDataType.SetCurSel(m_nInputMode);

return TRUE; // return TRUE unless you set the focus to a control
}

void CCommWizardDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialog::OnSysCommand(nID, lParam);
}
}

// If you add a minimize button to your dialog, you will need the code below
// to draw the icon. For MFC applications using the document/view model,
// this is automatically done for you by the framework.

void CCommWizardDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // device context for painting

SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

// Center icon in client rectangle
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;

// Draw the icon
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialog::OnPaint();
}
}

// The system calls this to obtain the cursor to display while the user drags
// the minimized window.
HCURSOR CCommWizardDlg::OnQueryDragIcon()
{
return (HCURSOR) m_hIcon;
}

void CCommWizardDlg::OnReceive()
{
// TODO: Add your control notification handler code here
m_Com.GetInput();//先预读缓冲区以清除残留数据
bReceive = !bReceive;
if(bReceive)
m_ctrlReceive.SetWindowText(_T("停止接收"));
else
m_ctrlReceive.SetWindowText(_T("开始接收"));
}

void CCommWizardDlg::OnSend()
{
// TODO: Add your control notification handler code here
bSend = !bSend;
if(bSend)
{
m_ctrlSend.SetWindowText(_T("停止发送"));
SetTimer(1,m_nTime,NULL);//时间为1000毫秒
}
else
{
m_ctrlSend.SetWindowText(_T("自动发送"));
KillTimer(1); //取消定时
}
}

void CCommWizardDlg::OnSettings()
{
// TODO: Add your control notification handler code here
CSettingDlg setDlg;

setDlg.nPort = m_nPort;
setDlg.nTime = m_nTime;
setDlg.strSettings = m_strSettings;
setDlg.strSendString = m_strSendString;

if(setDlg.DoModal() == IDOK)
{
m_nPort = setDlg.nPort;
m_nTime = setDlg.nTime;
m_strSettings = setDlg.strSettings;
m_strSendString = setDlg.strSendString;
}
OpenPort();
}

void CCommWizardDlg::OnSelchangeType()
{
// TODO: Add your control notification handler code here
m_nInputMode = m_ctrlDataType.GetCurSel();
}

void CCommWizardDlg::OnClear()
{
// TODO: Add your control notification handler code here
m_strReceive = _T("");
}

BEGIN_EVENTSINK_MAP(CCommWizardDlg, CDialog)
//{{AFX_EVENTSINK_MAP(CCommWizardDlg)
ON_EVENT(CCommWizardDlg, IDC_COMMCTRL, 1 /* OnComm */, OnOnCommCommctrl, VTS_NONE)
//}}AFX_EVENTSINK_MAP
END_EVENTSINK_MAP()

void CCommWizardDlg::OnOnCommCommctrl()
{
// TODO: Add your control notification handler code here
VARIANT variant_inp;
COleSafeArray safearray_inp;
LONG len,k;
BYTE rxdata[2048]; //设置BYTE数组 An 8-bit integerthat is not signed.
CString strtemp;
if(bReceive)
{
if(m_Com.GetCommEvent()==2) //事件值为2表示接收缓冲区内有字符
{
variant_inp = m_Com.GetInput(); //读缓冲区
safearray_inp = variant_inp; //VARIANT型变量转换为ColeSafeArray型变量
len=safearray_inp.GetOneDimSize(); //得到有效数据长度
for(k=0;k<len;k++)
safearray_inp.GetElement(&k,rxdata+k);//转换为BYTE型数组
for(k=0;k<len;k++) //将数组转换为Cstring型变量
{
BYTE bt=*(char*)(rxdata+k); //字符型

if(m_nInputMode == 2)
strtemp.Format("%02X ",bt); //将字符以十六进制方式送入临时变量strtemp存放,注意这里加入一个空隔
else
strtemp.Format("%c",bt); //将字符送入临时变量strtemp存放

m_strReceive = m_strReceive + strtemp; //加入接收编辑框对应字符串
}
m_strReceive += "\r\n";
}
}
UpdateData(FALSE); //更新编辑框内容
}

void CCommWizardDlg::OpenPort()
{
if(m_Com.GetPortOpen())
m_Com.SetPortOpen(FALSE);

m_Com.SetCommPort(m_nPort); //选择com1
if( !m_Com.GetPortOpen())
m_Com.SetPortOpen(TRUE);//打开串口
else
AfxMessageBox("cannot open serial port");

m_Com.SetSettings(m_strSettings); //波特率9600,无校验,8个数据位,1个停止位
m_Com.SetRThreshold(1);
//参数1表示每当串口接收缓冲区中有多于或等于1个字符时将引发一个接收数据的OnComm事件
m_Com.SetInputMode(1);
m_Com.SetInputLen(0); //设置当前接收区数据长度为0
m_Com.GetInput();//先预读缓冲区以清除残留数据
}

void CCommWizardDlg::OnManualsend()
{
// TODO: Add your control notification handler code here
CString strSend;

if(m_nInputMode > 1)
{
CByteArray hexdata;
int len=String2Hex(m_strSendString ,hexdata);
m_Com.SetOutput(COleVariant(hexdata));
}
else
m_Com.SetOutput(COleVariant(m_strSendString));//发送数据
}

void CCommWizardDlg::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
OnManualsend();
CDialog::OnTimer(nIDEvent);
}

int CCommWizardDlg::String2Hex(CString str, CByteArray &senddata)
{
int hexdata,lowhexdata;
int hexdatalen=0;
int len=str.GetLength();

senddata.SetSize(len/2);

for(int i=0;i<len;)
{
char lstr,hstr=str[i];
if(hstr==' ')
{
i++;
continue;
}
i++;
if(i>=len)
break;
lstr=str[i];
hexdata=ConvertHexChar(hstr);
lowhexdata=ConvertHexChar(lstr);
if((hexdata==16)||(lowhexdata==16))
break;
else
hexdata=hexdata*16+lowhexdata;
i++;
senddata[hexdatalen]=(char)hexdata;
hexdatalen++;
}

senddata.SetSize(hexdatalen);
return hexdatalen;
}

//这是一个将字符转换为相应的十六进制值的函数
//功能:若是在0-F之间的字符,则转换为相应的十六进制字符,否则返回-1
char CCommWizardDlg::ConvertHexChar(char ch)
{
if((ch>='0')&&(ch<='9'))
return ch-0x30;
else if((ch>='A')&&(ch<='F'))
return ch-'A'+10;
else if((ch>='a')&&(ch<='f'))
return ch-'a'+10;
else return (-1);
}

这个是VC++ 的 只要你会建一个相应的变量和对话框空间就行啦 http://blog.csdn.net/zhs1931/archive/2010/01/16/5193819.aspx
这个网站很清晰

推荐看书
Visual C++_Turbo C串口通信编程实践

非常经典

  • 涓婁綅鏈鏄埄鐢ㄨ櫄鎷熶华鍣ㄦ潵鎺у埗涓嬩綅鏈虹殑涔
    绛旓細鍙互浜や簰閫氳锛涓婁綅鏈哄彲浠鏄剧ず涓嬩綅鏈洪噰闆嗙殑鏁版嵁锛涓嬩綅鏈哄彲浠鎵ц涓婁綅鏈虹殑鎸囦护
  • 姹傚弬鑰涓涓VB涓婁綅鏈涓涓嬩綅鏈鎵鐢ㄧ殑S18B20杩涜涓插彛閫氫俊鐨勭▼搴
    绛旓細鎴戠敤鍙︿竴鍙癙C鏈烘ā鎷熶笅浣嶆満锛屼袱鍙癙C鏈轰綔涓茶閫氫俊锛涓婁綅PC鏈烘帴鏀涓嬩綅鏈虹殑娓╁害鏁版嵁骞剁粯鍑烘椂闂-娓╁害鏇茬嚎锛孷B绋嬪簭鍙緵浣犲弬鑰冦傝繍琛屾儏鍐靛鎴浘鎵鏈紝鑻ラ噰绾筹紝鍒橵B宸ョ▼鍙婇檮甯︽枃浠跺彂鑷充綘閭銆
  • LED鏄剧ず灞涓婁綅鏈鍜涓嬩綅鏈閫氫俊銆
    绛旓細鍙互閲囩敤flash鑺墖锛堟瘮杈冭吹锛夋垨鑰呬覆琛岀殑EEprom鑺墖姣旇緝渚垮疁锛岃繖浜涢兘鏄柇鐢典篃淇濇寔鏁版嵁鐨勩備篃鍙互閲囩敤Ram+璁板繂鐢垫睜锛堢數姹犳柇鐢靛氨娌℃暟鎹簡锛夈傜▼搴忕殑璇濓紝鍐欏ソ涓茶閫氫俊鍜屾暟鎹繚瀛樿鍙栫殑绋嬪簭銆傜偣闃垫樉绀虹▼搴忔垜灏变笉鎻愪簡銆傚鏋滀綘鐨勮璁″甫瀛楀簱鐨勮瘽锛屼綘涓婁綅鏈绌跨殑鏁版嵁锛屾瘡鍙屽瓧鑺傚氨鏄1涓姹夊瓧浜嗐
  • 璋佹湁涓婁綅鏈涓涓嬩綅鏈虹殑涓插彛閫氳浠g爜(C璇█鐨)
    绛旓細鍏勫紵锛屼笅闈㈡槸鎴戣嚜宸卞啓鐨勶紝甯屾湜缁欎綘甯姪锛屾妸鏁版嵁鐢╯end_one_uart()杩欎釜鍑芥暟鐩存帴鍙戦佸埌涓插彛灏辫浜嗭紒鏈鍚庢眰閲囩撼锛屽搱鍝堬紒//---澶存枃浠 include<reg52.h> //---瀹氫箟鍏ㄥ眬鍙橀噺 unsigned char temp;/ 鍑芥暟鍚嶇О:uart_init 鍔熻兘鎻忚堪:涓插彛鍒濆鍖栧嚱鏁 杈 鍏ワ細鏃 杈 鍑:鏃 璇 鏄:鏃 / void uart_init(v...
  • ...鎴戞暟鎹兘鐢ㄤ覆鍙h皟璇曞姪鎵嬬湅鍒,涔熻兘涓婁綅鏈烘帶鍒朵笅浣嶆満,灏辨槸涓嶈兘鎶...
    绛旓細鍙互鐢╒B涓殑MSCOMM鎺т欢鍜屽崟鐗囨満杩涜閫氳,鎺ユ敹鍗曠墖鏈烘暟鎹,鐒跺悗鍦╒B绋嬪簭閲屼娇鐢ㄧ▼搴忕敾绾垮氨琛屼簡
  • 涓婁綅鏈涓涓嬩綅鏈虹殑鍏崇郴鏄庢牱鐨?
    绛旓細鑱旂郴锛氫笅浣嶆満鎸囩殑灏辨槸PLC锛屼笂浣嶆満鍙戝嚭鐨勫懡浠ら鍏缁欎笅浣嶆満锛屼笅浣嶆満鍐嶆牴鎹鍛戒护瑙i噴鎴愮浉搴旀椂搴忎俊鍙风洿鎺鎺у埗鐩稿簲PLC璁惧銆備笅浣嶆満涓嶆椂璇诲彇璁惧鐘舵佹暟鎹紙涓鑸负妯℃嫙閲忥級锛岃浆鎹㈡垚鏁板瓧淇″彿鍙嶉缁欎笂浣嶆満銆傚尯鍒細涓銆佷富浣撲笉鍚 1銆佷笂浣嶆満锛氬彲浠ョ洿鎺ュ彂鍑烘搷鎺у懡浠ょ殑璁$畻鏈恒2銆佷笅浣嶆満锛氱洿鎺ユ帶鍒惰澶囪幏鍙栬澶囩姸鍐电殑...
  • 淇╀釜鍗曠墖鏈轰箣闂撮氫俊銆傚埄鐢ㄥ崐鍙屽伐銆涓婁綅鏈缁欏彂閫佹寚浠,涓嬩綅鏈鎺ュ彈...
    绛旓細鏁堥獙浣嶆棤 (12M) TH1 = 0xFD; // TH1 = 0xFD; 娉㈢壒鐜 9600 TL1 = 0xFD; TR1 = 1; while(1) { if(k0==0 && y0==0) { y0=1; SBUF=0xc0; led=0; } if(k0==1 ) { y0=0; } if(k1==0 && y1==0) { y1=1; SBUF=0xf9; led=0; } if(...
  • 涓婁綅鏈(VB)涓涓嬩綅鏈(鍗曠墖鏈))濡備綍瀹炵幇閫氫俊
    绛旓細浠跨湡鏂归潰锛氬疄鐜版寜閿彂闊筹紝骞跺彂閫佺浉搴斾俊鎭粰涓婁綅鏈锛岄氱煡涓婁綅鏈哄摢涓敭瀛愭寜浜嗐傚叾涓涓嬩綅鏈浠跨湡閮ㄥ垎鐨勫疄鐜帮紝闇瑕佸彂澹般佷覆鍙e彂閫侊紝鍙婁腑鏂柟闈㈢殑鍐呭锛岄渶瑕佺爺璁ㄣ俈B涔熷氨鏄笂浣嶆満锛屽叾瀹炵浉瀵圭畝鍗曪紝閫氳繃涓插彛鎺т欢锛屽疄鐜拌鍙栦笅浣嶆満鍙戦佽繃鏉ョ殑閿间俊鎭紝骞惰繘琛岀浉搴斿鐞嗐傛垜鍙槸姒傝鐨勮鏄庝簡椤圭洰鍙疄鐜板強闇瑕佺殑鐩稿叧鐨勭煡璇...
  • VC++鎬庢牱缂栫▼瀹炵幇涓婁綅鏈涓涓嬩綅鏈虹殑閫氫俊
    绛旓細瀹屽叏閫氫俊鎴愬姛鍚庯紝鍦ㄧ敤鏉ヨ皟璇曚綘鐨涓婁綅鏈銆備笉鐒朵綘璇濓紝浣犻兘涓嶇煡閬撻敊璇湪鍝噷銆傚姞鍏ヤ笅浣嶆満涓嶆槸寮鍙戠殑锛屾牴鏈氨鏃犳硶璇佹槑鏄惁鏄涓嬩綅鏈虹殑閿欒銆傚厛浣跨敤涓插彛绮剧伒涔嬬被鐨勮皟璇曚綘鐨勫紑鍙戞澘銆傜‘璁ゆ槸 OK 浜嗕箣鍚庯紝鍦ㄨ皟璇曚綘鐨勭▼搴忋//濡傛灉浣犵殑绋嬪簭鍔熷簳瓒冲娣憋紝灏卞彲浠ラ氳繃浣犵殑绋嬪簭纭畾鏄笂锛岃繕鏄笅浣嶆満鐨勯棶棰樹簡銆
  • 璁捐涓涓閫氫俊妯″潡,瀹炵幇涓婁綅PC涓涓嬩綅鏈鍗曠墖鏈轰箣闂寸殑閫氳銆傞氫俊鍗忚浣跨敤...
    绛旓細缁欑偣瀛愮▼搴忓弬鑰冧笅灏卞彲浠 ORG 0023H LJMP UART_INT ;--- MOV SCON,#0D0H ;涓插彛鏂瑰紡3锛11浣嶏級MOV TMOD,#20H ;T1涓8浣嶉噸瑁 MOV TH1,#0F5H ; 9600 PTS(40.6M)MOV TL1,#0F5H ;;--- ;--- MOV TMOD,#21H;瀹氭椂鍣0锛屾柟寮1锛16浣嶉噸瑁,,瀹氭椂鍣1锛屾柟寮2锛8浣嶉噸瑁 MOV AUXR,#...
  • 扩展阅读:控制板卡属于下位机 ... 上位机如何控制单片机 ... 什么叫上位机下位机 ... plc上位机软件有哪些 ... 上位机 中位机 下位机 ... 入门较快的上位机软件 ... 上位机与下位机连接 ... 上位机怎么调用下位机 ... 大众上位机下位机哪个好 ...

    本站交流只代表网友个人观点,与本站立场无关
    欢迎反馈与建议,请联系电邮
    2024© 车视网