WindowAPI串口通讯

上下位机通讯的时候,常常需要用到串口通讯。串口通讯的两种操作方式:同步(API阻塞等到操作完成返回,阻塞监听线程)和异步(API函数立即返回,操作在后台完成)操作。
操作流程:打开串口,配置串口,读写串口,关闭串口,实现这四个操作就完成了对串口的基本操作。
1.打开串口,使用CreateFile:
使用同步方式打开串口:
HANDLE hCom = CreateFile("COM1",GENERIC_READ | GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,NULL);
if(hCom == (HANDLE)-1)
{
//error
}
使用异步方式打开
HANDLE hCom = CreateFile("COM1",GENERIC_READ | GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPED,NULL);
if(hCom == INVALID_HANDLE_VALUE)
{
//error
}


2.配置串口,
需要使用DCB结构来作为缓冲区,使用GetCommState获得初始配置,通过修改DCB结构,再调用SetCommState.
除了在BCD中对串口配置,程序需要设置I/O缓冲区大小和超时。通讯速率高则缓冲区大,使用SetupComm函数来进行设置。
超时的作用是在读写串口时,在指定时间内没有完成对应的读写操作则退出操作。
具体操作有,查询当前超时时间:GetCommTimeouts,设置超时时间:SetCommTimeouts
读写串口超时有间隔超时(接受时两个字符间最大延时)和总超时(读写总共花费最大时间)。读操作支持两种超时,写操作只支持总超时。
COMMTIMEOUTS结构体:总超时时间= 时间系数*要求读写字符数+时间常量


SetupComm(hCom,1024,1024);
COMMTIMEOUTS TimeOuts;
//设定读超时
TimeOuts.ReadIntervalTimeout = 1000; //读间隔
TimeOuts.ReadTotalTimeOutMultiplier= 500; //时间系数
TimeOuts.ReadTotalTimeoutConstant= 5000; //常量
//写超时类似
DCB dcb;
GetCommState(hCom,&dcb);
dcb.BaudRate = 9600;
dcb.ByteSize = 8;
dcb.Parity = NOPARITY;
dcb.StopBits= TWOSTOPBITS;
SetCommState(hCom,&dcb);
//清除缓冲区的内存
PurgeComm(hCom,PURGE_TXCLEARI|PURGE_RXCLEAR);






3.读写串口(ReadFile 和 WriteFile)
读写串口时可以同步或异步执行。同步执行的效率会下降。由创建Creatfile得到的句柄来判断是同步执行还是异步执行。


同步读写串口:
char str[100];
DWORD wCount;
BOOL ret;
ret = ReadFile(hCom,str,100,&wCount,NUll);
if(!ret)
{
//读取串口失败
}




char buf[100];
DWORD dwBytesWrite = 100;
COMSTAT ComStat;
DWORD dwErrorFlag;
BOOL ret;
//清除串口的错误
ClearCommErrorh(hCom,&dwErrorFlags,&ComStat);
ret = WriteFile(hCom,buf,dwBytesWrite,&dwBytesWrite,NULL);
if(!ret)
{
//写失败
}




异步读写操作:
使用WaitForSingleObject等待OVERLAPPEND结构的hEvent成员;
调用GetOverlappedResult函数来等待。
OVERLAPPED结构包含重叠IO的信息;读写线程通过其中的hEvent成员来获得操作状态,通过检查该成员也可以获得是否读写完毕。当调用ReadFile和WriteFile时,该成员置为无信号,完成操作置为有信号状态。




4.关闭串口使用ClosHandle来关闭创建的句柄。



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值