VC串口编程的实例1

梦里梦外; 2022-08-10 04:59 217阅读 0赞

  本例程采用同步串口操作,我们只介绍软件部分,RS485接口接线方法不作介绍,感兴趣的读者可以查阅相关资料。

  打开VC++6.0,新建基于对话框的工程RS485Comm,在主对话框窗口IDD_RS485COMM_DIALOG上添加两个按钮,ID分别为IDC_SEND和IDC_RECEIVE,标题分别为“发送”和“接收”;添加一个静态文本框IDC_DISP,用于显示串口接收到的内容。

1. 添加全局变量

在RS485CommDlg.cpp文件中添加全局变量

  1. HANDLE hCom; //全局变量,串口句柄

2. 初始化串口参数

在RS485CommDlg.cpp文件中的OnInitDialog()函数添加如下代码

  1. // TODO: Add extra initialization here
  2. hCom=CreateFile("COM1",//COM1口
  3. GENERIC_READ|GENERIC_WRITE, //允许读和写
  4. 0, //独占方式
  5. NULL,
  6. OPEN_EXISTING, //打开而不是创建
  7. 0, //同步方式
  8. NULL);
  9. if(hCom==(HANDLE)-1)
  10. {
  11. AfxMessageBox("打开COM失败!");
  12. return FALSE;
  13. }
  14. COMMTIMEOUTS TimeOuts;
  15. //设定读超时
  16. TimeOuts.ReadIntervalTimeout=MAXDWORD;
  17. TimeOuts.ReadTotalTimeoutMultiplier=0;
  18. TimeOuts.ReadTotalTimeoutConstant=0;
  19. //在读一次输入缓冲区的内容后读操作就立即返回,
  20. //而不管是否读入了要求的字符。
  21. //设定写超时
  22. TimeOuts.WriteTotalTimeoutMultiplier=100;
  23. TimeOuts.WriteTotalTimeoutConstant=500;
  24. SetCommTimeouts(hCom,&TimeOuts); //设置超时
  25. DCB dcb;
  26. GetCommState(hCom,&dcb);
  27. dcb.BaudRate=9600; //波特率为9600
  28. dcb.ByteSize=8; //每个字节有8位
  29. dcb.Parity=NOPARITY; //无奇偶校验位
  30. dcb.StopBits=TWOSTOPBITS; //两个停止位
  31. SetCommState(hCom,&dcb);
  32. PurgeComm(hCom,PURGE_TXCLEAR|PURGE_RXCLEAR);

3. 添加发送和接收函数

分别双击IDC_SEND按钮和IDC_RECEIVE按钮,添加两个按钮的响应函数

  1. //发送串口信息
  2. void CRS485CommDlg::OnSend()
  3. {
  4. // TODO: Add your control notification handler code here
  5. // 在此需要简单介绍百特公司XMA5000的通讯协议:
  6. //该仪表RS485通讯采用主机广播方式通讯。
  7. //串行半双工,帧11位,1个起始位(0),8个数据位,2个停止位(1)
  8. //如:读仪表显示的瞬时值,主机发送:DC1 AAA BB ETX
  9. //其中:DC1是标准ASCII码的一个控制符号,码值为11H(十进制的17)
  10. //在XMA5000的通讯协议中,DC1表示读瞬时值
  11. //AAA是从机地址码,也就是XMA5000显示仪表的通讯地址
  12. //BB为通道号,读瞬时值时该值为01
  13. //ETX也是标准ASCII码的一个控制符号,码值为03H
  14. //在XMA5000的通讯协议中,ETX表示主机结束符
  15. char lpOutBuffer[7];
  16. memset(lpOutBuffer,''\0'',7); //前7个字节先清零
  17. lpOutBuffer[0]=''\x11''; //发送缓冲区的第1个字节为DC1
  18. lpOutBuffer[1]=''0''; //第2个字节为字符0(30H)
  19. lpOutBuffer[2]=''0''; //第3个字节为字符0(30H)
  20. lpOutBuffer[3]=''1''; // 第4个字节为字符1(31H)
  21. lpOutBuffer[4]=''0''; //第5个字节为字符0(30H)
  22. lpOutBuffer[5]=''1''; //第6个字节为字符1(31H)
  23. lpOutBuffer[6]=''\x03''; //第7个字节为字符ETX
  24. //从该段代码可以看出,仪表的通讯地址为001
  25. DWORD dwBytesWrite=7;
  26. COMSTAT ComStat;
  27. DWORD dwErrorFlags;
  28. BOOL bWriteStat;
  29. ClearCommError(hCom,&dwErrorFlags,&ComStat);
  30. bWriteStat=WriteFile(hCom,lpOutBuffer,dwBytesWrite,&dwBytesWrite,NULL);
  31. if(!bWriteStat)
  32. {
  33. AfxMessageBox("写串口失败!");
  34. }
  35. }
  36. //接收串口信息
  37. void CRS485CommDlg::OnReceive()
  38. {
  39. // TODO: Add your control notification handler code here
  40. char str[100];
  41. memset(str,''\0'',100);
  42. DWORD wCount=100;//读取的字节数
  43. BOOL bReadStat;
  44. bReadStat=ReadFile(hCom,str,wCount,&wCount,NULL);
  45. if(!bReadStat)
  46. {
  47. AfxMessageBox("读串口失败!");
  48. }
  49. PurgeComm(hCom, PURGE_TXABORT|
  50. PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR);
  51. m_disp=str;
  52. UpdateData(FALSE);
  53. }

4. 关闭串口

  您可以观察返回的字符串,其中有和仪表显示值相同的部分,您可以进行相应的字符串操作取出仪表的显示值。
  打开ClassWizard,为静态文本框IDC_DISP添加CString类型变量m_disp,同时添加WM_CLOSE的相应函数:

  1. void CRS485CommDlg::OnClose()
  2. { // TODO: Add your message handler code here and/or call default CloseHandle(hCom); //程序退出时关闭串口 CDialog::OnClose(); }

  程序的相应部分已经在代码内部作了详细介绍。连接好硬件部分,编译运行程序,细心体会串口同步操作部分。

发表评论

表情:
评论列表 (有 0 条评论,217人围观)

还没有评论,来说两句吧...

相关阅读

    相关 VC串口编程实例2

      本例程采用异步串口操作,我们只介绍软件部分,RS485接口接线方法不作介绍,感兴趣的读者可以查阅相关资料。   打开VC++6.0,新建基于对话框的工程RS485Com

    相关 VC串口编程实例1

      本例程采用同步串口操作,我们只介绍软件部分,RS485接口接线方法不作介绍,感兴趣的读者可以查阅相关资料。   打开VC++6.0,新建基于对话框的工程RS485Comm

    相关 VC串口API通信详解

      在工业控制中,工控机(一般都基于Windows平台)经常需要与智能仪表通过串口进行通信。串口通信方便易行,应用广泛。   一般情况下,工控机和各智能仪表通过RS485总

    相关 VC多线程编程实例

    在本文中我们以实例的形式来介绍一下VC中的多线程编程,本文中没有涉及线程的相关同步问题我们更多的是讲述VC下的线程相关操作与编写方法等,至于线程的同步问题请参见《[WinCE线