C++实现的串口通信

时间:2010-03-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);

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



  
上一篇:基于开源软件构建先进的嵌入式电源管理
下一篇:基于DSP的逆变电源控制系统研究

免责声明: 凡注明来源本网的所有作品,均为本网合法拥有版权或有权使用的作品,欢迎转载,注明出处。非本网作品均来自互联网,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。

相关技术资料