串口通信主要用到下面几个函数:
CreateFile打开通信端口CloseHandle关闭通信端口GetCommState取得端口的参数SetCommState设置端口参数WriteFile端口发送数据ReadFile端口读取数据ClearCommError清除端口错误,并取得信息PurgeComm清除数据缓冲区SetCommMask设置触发事件WaitCommEvent等待事件触发EscapeCommFunction控制端口的硬件状态GetCommModemState取得端口硬件线路状态(1)串口同步通信
Handle hComm=CreateFile("COM1",GENERIC_READ | GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,0); //打开COM1端口
if(hComm==INVALID_HANDLE_VALUE)
//打开端口失败else{
DCB dcb;GetCommState(hComm,&dcb);//取得端口状态dcb.BaudRate=CBR_9600; //波特率设为9600 dcb.ByteSize=8;//字节为8位dcb.Parity=NOPARITY;//无校验dcb.StopBits=ONESTOPBIT;//1位停止位
if(!SetCommState(hComm,&dcb)){//端口状态设置失败CloseHandle(hComm);}
else
//端口设置成功
}
读数据
char inbuff[1024];
DWORD nBytesRead,dwEvent,dwError;
COMSTAT cs;
//取得状态
ClearCommError(hComm,&dwError,&cs);
if(cs.cbInQue>sizeof(inbuff))//数据是否大于缓冲区
{
PurgeComm(hComm,PURGE_RXCLEAR);
return;
}
ReadFile(hComm,inbuff,cs.cbInQue,&nBytesRead,NULL);
....
发送数据
...
WriteFile(hComm,SendData,sizeof(SendData),&nBytesSend,NULL);
...
(2)串口异步通信
使用同步通信时,读数据时若端口没有数据,程序将一直停在ReadFile处,程序当掉.解决的办法是使用异步通信.
Handle hComm=CreateFile("COM1",GENERIC_READ | GENERIC_WRITE,0,NULL,OPEN_EXISTING,
FILE_FLAG_OVERLAPPED,//使用异步通信方式
0); //打开COM1端口
if(hComm==INVALID_HANDLE_VALUE)
//打开端口失败else{
DCB dcb;GetCommState(hComm,&dcb);//取得端口状态dcb.BaudRate=CBR_9600; //波特率设为9600 dcb.ByteSize=8;//字节为8位dcb.Parity=NOPARITY;//无校验dcb.StopBits=ONESTOPBIT;//1位停止位
if(!SetCommState(hComm,&dcb)){//端口状态设置失败CloseHandle(hComm);}
else
//端口设置成功
long EvWait;
EvWait=EV_ERR + EV_BREAK + EV_RXCHAR;
if(!SetCommMask(hComm,EvWait))
//设置失败
}
收数据
TEvent *WEvent;
OVERLAPPED OverLap;
TWaitResult EE;
unsigned long EvWait;
WEvent=new TEvent(NULL,true,false,"");
OverLap.hEvent=WEvent->Handle;
if(WaitCommEvent(hComm,&EvWait,&OverLap))
{
EE!=wrSignaled)return;//未触发
WEvent->ResetEvent();
if(EvWait & EV_RXCHAR)
{
ReadFile(..);
}
xgbing 认证博客专家 驱动开发 arm开发 嵌入式硬件 专注于嵌入式方向的软硬件设计与开发(ASM\C\C ,RTOS,Linux,android,以太网\嵌入式网络协议栈,蓝牙,WIFI,文件系统/嵌入式存储,显示\音频,单片机\DSP\ARM\Cortex,电路设计\PCB布板\硬件驱动\数字逻辑CPLD,FPGA\niosII),目前从事VirtualBox\qemu\KVM虚拟化研究工作。