搜索
bottom↓
回复: 5

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

[复制链接]

出45入88汤圆

发表于 2020-2-29 17:41:44 | 显示全部楼层 |阅读模式
波特率是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);  
}  

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出55入66汤圆

发表于 2020-2-29 17:48:04 | 显示全部楼层
直接去github找个开源的就行了,稳定好用

出45入88汤圆

 楼主| 发表于 2020-2-29 17:50:22 | 显示全部楼层
cpumaker 发表于 2020-2-29 17:48
直接去github找个开源的就行了,稳定好用

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

出45入88汤圆

 楼主| 发表于 2020-2-29 17:52:14 | 显示全部楼层
我是开了两条线程,一条是用阻塞方式读。另外一条是发送。

出0入0汤圆

发表于 2020-2-29 19:09:22 | 显示全部楼层
用C#不好吗?

出45入88汤圆

 楼主| 发表于 2020-2-29 23:20:59 | 显示全部楼层
参考了这个代码后现在使用异步。通信速度快多了。没有阻塞。
https://www.amobbs.com/forum.php ... B%E4%B8%B2%E5%8F%A3
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-26 05:39

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表