欢迎访问ic37.com |
会员登录 免费注册
发布采购

C++实现的串口通信

日期:2010-3-15标签: (来源:互联网)

上位机和下位机通信的问题,使用的协议rs485协议.

题目是用VC++让上位机和下位机进行通信.

接在电脑上的rs232口,使用了232和485的转换器,发送相应的数据格式,然后上位机接受相应的格式。

原代码如下:

/⁄TODO: Add your control notification handler code here

char buff[200];

CString str;

GetDlgItem(IDC_EDI_BUF) -> GetWindowText(str);

sprintf(buff,"%s",(LPCSTR)str);

//MessageBox(buff);

//然后打开串口,开始通信

HANDLE hCom; //createFile函数返回的句柄

//打开的是端口一

hCom = CreateFile("COM1",GENERIC_READ|GENERIC_WRITE,

0, NULL,OPEN_EXISTING, 0, NULL);

if(hCom == NULL)

{

MessageBox("打开端口一时出现了错误");

}

//设置读写缓冲区的缓冲大小

//改变端口的设备控制

/DCB dcb;

GetCommState(hCom,&dcb);

dcb.BaudRate = CBR_9600;

dcb.ByteSize=8;//数据位8位

dcb.Parity = NOPARITY; //有校验

dcb.StopBits=ONESTOPBIT; //一个停止位

if(false==SetCommState(hCom,&dcb))

{

MessageBox("配置端口时出现了错误");

}/

DCB dcb;

GetCommState(hCom,&dcb);

dcb.BaudRate = CBR_9600;

dcb.ByteSize = 8;

dcb.Parity = NOPARITY;

dcb.StopBits = ONESTOPBIT;

dcb.fBinary = TRUE;

dcb.fParity = TRUE;

dcb.fOutxDsrFlow = false;

dcb.fDtrControl = DTR_CONTROL_DISABLE;

dcb.fOutxCtsFlow = false;

//#ifdef LPR_DOHERELARGE

/⁄dcb.fRtsControl = RTS_CONTROL_ENABLE;

//#else

dcb.fRtsControl = RTS_CONTROL_DISABLE;

//#endif

/ dcb.fInX = false;

dcb.fOutX = false;

dcb.XonChar = ASCII_XON;

dcb.XoffChar = ASCII_XOFF;

dcb.XonLim = 100;

dcb.XoffLim = 100;/

if(false==SetCommState(hCom,&dcb))

{

MessageBox("配置端口时出现了错误");

}

//设置读写操作,将缓冲里面的数据写入到串口里面

BOOL isWrite = false;

DWORD length = 100;

COMSTAT ComStat;

DWORD dwErrorFlags;

ClearCommError(hCom,&dwErrorFlags,&ComStat);

isWrite = WriteFile(hCom,buff,length,&length,NULL);

if(isWrite == false)

{

MessageBox("写入数据时出现了错误");

}

//写完数据然后从缓冲里面读取数据

//过一段时间才读取缓冲里面的数据

::Sleep(100);

//读取缓冲里面的数据

BOOL isRead = false;

char readbuf[100];

DWORD bReadStatus;

memset(readbuf,0,sizeof(readbuf));

isRead = ::ReadFile(hCom,readbuf,100,&bReadStatus,NULL);

//MessageBox(readbuf);

GetDlgItem(IDC_RECV_BUFF) -> SetWindowText(readbuf);

CloseHandle(hCom);

这样就完成了一次通信。还有从下位机发送来的报文解析部分没有给出。那部分是纯的软件部分。和机器无关。