串口通信笔记

    技术2022-05-11  71

    串口通信主要用到下面几个函数:

    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虚拟化研究工作。

    最新回复(0)