设为首页 加入收藏

TOP

串口异步同步通讯(一)
2014-11-23 23:11:44 来源: 作者: 【 】 浏览:5
Tags:串口 异步 同步 通讯


/*------+------+------+------+------+------+------+------+------+------+------+------
串口编程的一个实例
  为了让您更好地理解串口编程,下面我们分别编写两个例程(见附带的源码部分),
这两个例程都实现了工控机与百特显示仪表通过RS485接口进行的串口通信。其中
第一个例程采用同步串口操作,第二个例程采用异步串口操作。
  我们只介绍软件部分,RS485接口接线方法不作介绍,感兴趣的读者可以查阅相关资料。
/*------+------+------+------+------+------+------+------+------+------+------+----*/

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

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

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

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

// TODO: Add extra initialization here
hCom=CreateFile( "COM1", //COM1口
GENERIC_READ|GENERIC_WRITE, //允许读和写
0, //独占方式
NULL,
OPEN_EXISTING, //打开而不是创建
0, //同步方式
NULL );
if(hCom==(HANDLE)-1)
{
AfxMessageBox("打开COM失败!");
return FALSE;
}

SetupComm(hCom,100,100); //输入缓冲区和输出缓冲区的大小都是1024

COMMTIMEOUTS TimeOuts;

//设定读超时
TimeOuts.ReadIntervalTimeout=MAXDWORD;
TimeOuts.ReadTotalTimeoutMultiplier=0;
TimeOuts.ReadTotalTimeoutConstant=0;

//在读一次输入缓冲区的内容后读操作就立即返回,
//而不管是否读入了要求的字符。

//设定写超时
TimeOuts.WriteTotalTimeoutMultiplier=100;
TimeOuts.WriteTotalTimeoutConstant=500;

SetCommTimeouts(hCom,&TimeOuts); //设置超时

DCB dcb;
GetCommState(hCom,&dcb);
dcb.BaudRate=9600; //波特率为9600
dcb.ByteSize=8; //每个字节有8位
dcb.Parity=NOPARITY; //无奇偶校验位
dcb.StopBits=TWOSTOPBITS; //两个停止位
SetCommState(hCom,&dcb);

PurgeComm(hCom,PURGE_TXCLEAR|PURGE_RXCLEAR);

//分别双击IDC_SEND按钮和IDC_RECEIVE按钮,添加两个按钮的响应函数:
void CRS485CommDlg::OnSend()
{
/*------+------+------+------+------+------+------+------+-------
| TODO: Add your control notification handler code here |
| 在此需要简单介绍百特公司XMA5000的通讯协议: |
| 该仪表RS485通讯采用主机广播方式通讯。 |
| 串行半双工,帧11位,1个起始位(0),8个数据位,2个停止位(1) |
| 如:读仪表显示的瞬时值,主机发送:DC1 AAA BB ETX |
| 其中:DC1是标准ASCII码的一个控制符号,码值为11H(十进制的17) |
| 在XMA5000的通讯协议中,DC1表示读瞬时值 |
| AAA是从机地址码,也就是XMA5000显示仪表的通讯地址 |
| BB为通道号,读瞬时值时该值为01 |
| ETX也是标准ASCII码的一个控制符号,码值为03H |
| 在XMA5000的通讯协议中,ETX表示主机结束符 |
------+------+------+------+------+------+------+------+------+*/
char lpOutBuffer[7];
memset(lpOutBuffer,''\0'',7); //前7个字节先清零
lpOutBuffer[0]=''\x11''; //发送缓冲区的第1个字节为DC1
lpOutBuffer[1]=''0''; //第2个字节为字符0(30H)
lpOutBuffer[2]=''0''; //第3个字节为字符0(30H)
lpOutBuffer[3]=''1''; // 第4个字节为字符1(31H)
lpOutBuffer[4]=''0''; //第5个字节为字符0(30H)
lpOutBuffer[5]=''1''; //第6个字节为字符1(31H)
lpOutB

首页 上一页 1 2 3 下一页 尾页 1/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇 C语言中史上最愚蠢的Bug 下一篇链表逆序的递归/非递归算法

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: