• 博客园logo
  • 会员
  • 周边
  • 新闻
  • 博问
  • 闪存
  • 众包
  • 赞助商
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
平衡适可而止
博客园    首页    新随笔    联系   管理    订阅  订阅

C++实现的串口通信

上位机和下位机通信的问题,使用的协议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);

 

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

posted @ 2010-03-10 21:09  平衡适可而止  阅读(4898)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2026
浙公网安备 33010602011771号 浙ICP备2021040463号-3