Edesigner. 发表于 2020-2-29 17:41:44

帮手看看我用VC写的串口通信,同步写操作阻塞时间长的原因

波特率是115200,写260个字节左右,占用50毫秒到1000毫秒不等的时间,按计算发送完应该是22.6毫秒左右,不至于那么多。
相关的代码:

/**
open serial   
@param COMx: eg:_T("COM1")
@param BaudRate:
return 0 success ,return Negative is haed err   
*/
int Serial_open(LPCWSTR COMx,int BaudRate)
{
    DCB dcb={0};
    COMMTIMEOUTS CommTimeOuts;
    hCom =CreateFile(COMx,
      GENERIC_READ|GENERIC_WRITE,   
      0,
      0,
      OPEN_EXISTING,
      0,//FILE_FLAG_OVERLAPPED,   //同步方式 或 重叠方式
      0
      );

    if(hCom ==INVALID_HANDLE_VALUE)
    {
      DWORD dwError=GetLastError();
      return -1;
    }

    dcb.DCBlength = sizeof(DCB);

    if(!GetCommState(hCom,&dcb))
    {
      DWORD dwError=GetLastError();
      return -1;
    }

    dcb.BaudRate = BaudRate;    //波特率
    dcb.ByteSize = 8;         //位数
    dcb.Parity = NOPARITY;      //奇偶检验
    dcb.StopBits =ONESTOPBIT;   //停止位数
    dcb.fOutxCtsFlow = FALSE;
    dcb.fOutxDsrFlow = FALSE;
    if(!SetCommState(hCom,&dcb))
    {
      DWORD dwError=GetLastError();
      return -1;
    }
    if( !PurgeComm( hCom, PURGE_RXCLEAR ) )    return -1;
    SetCommMask(hCom,EV_RXCHAR);      //串口事件:接收到一个字符
   

    GetCommTimeouts(hCom,&CommTimeOuts);
    CommTimeOuts.ReadIntervalTimeout=10;            //接收字符间最大时间间隔;原值100
    CommTimeOuts.ReadTotalTimeoutMultiplier=10;
    CommTimeOuts.ReadTotalTimeoutConstant=10;    //读数据总超时常量;原值100
    CommTimeOuts.WriteTotalTimeoutMultiplier=0;
    CommTimeOuts.WriteTotalTimeoutConstant=0;
   
    if(!SetCommTimeouts(hCom,&CommTimeOuts))
    {
      printf("无法设置超时参数!\n");
      CloseHandle(hCom);
      return -1;

    }

   
    SetupComm(hCom,4096,4096);
    return 0;
}

/**
serial read
@param Buf:data buf
@param size:
@return The len of read
*/
int Serial_read(void *OutBuf,int size)
{
    DWORD cnt=0;
    ReadFile(hCom,OutBuf,size,&cnt,0);
    return cnt;

}

/**
serial write
@param Buf:data buf
@param size:bytes of Buf
@return The len of writen
*/
int Serial_write(const void *Buf,int size)
{
    DWORD dw;
    WriteFile(hCom,Buf,size,&dw,NULL);
    return dw;
}

/**
serial close
*/
void Serial_close(void)
{
    CloseHandle(hCom);
}

cpumaker 发表于 2020-2-29 17:48:04

直接去github找个开源的就行了,稳定好用

Edesigner. 发表于 2020-2-29 17:50:22

cpumaker 发表于 2020-2-29 17:48
直接去github找个开源的就行了,稳定好用

把你测试过稳定的发上来。谢谢

Edesigner. 发表于 2020-2-29 17:52:14

我是开了两条线程,一条是用阻塞方式读。另外一条是发送。

dongwang_fl 发表于 2020-2-29 19:09:22

用C#不好吗?

Edesigner. 发表于 2020-2-29 23:20:59

参考了这个代码后现在使用异步。通信速度快多了。没有阻塞。
https://www.amobbs.com/forum.php?mod=viewthread&tid=5469155&highlight=VC%2B%E4%B8%B2%E5%8F%A3
页: [1]
查看完整版本: 帮手看看我用VC写的串口通信,同步写操作阻塞时间长的原因