使用C++如何实现串口通信

原创|其它|编辑:郝浩|2010-03-15 10:01:58.000|阅读 1142 次

概述:上位机和下位机通信的问题,使用的协议rs485协议.接在电脑上的rs232口,使用了232和485的转换器,发送相应的数据格式,然后上位机接受相应的格式。

# 界面/图表报表/文档/IDE等千款热门软控件火热销售中 >>

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

  接在电脑上的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);

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


标签:

本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@evget.com

文章转载自:网络转载

为你推荐

  • 推荐视频
  • 推荐活动
  • 推荐产品
  • 推荐文章
  • 慧都慧问
扫码咨询


添加微信 立即咨询

电话咨询

客服热线
023-68661681

TOP