串口发送缓冲区的疑问?

akxu2006 2009-01-04 04:41:56
我想发上万字节的数据,让串口20ms发送一帧36字节的数据,缓冲区设置的是SetupComm(hPort,32768,32768);
发送延时设置的CommTimeouts.WriteTotalTimeoutConstant = 20; WriteFile也是20ms一次。可是发送到一半就停了,后面发出来的几百个字节都是错误的数据。请问缓冲区最大可以多大啊?我出现这个问题是哪造成的?
...全文
663 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq14923349 2009-01-06
  • 打赏
  • 举报
回复
那个是总超时
如果你的操作小于总超时他就发出去了

如果总超时比你的操作发送时间短
那么总超时内的数据就先发

剩下的数据后发

我给的你一点都不看···
yangsen2016 2009-01-06
  • 打赏
  • 举报
回复
mark
一条晚起的虫 2009-01-06
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 akxu2006 的回复:]
为什么我把WriteTotalTimeoutMultiplier=1000;WriteTotalTimeoutConstant=5000;可是串口Writefile还是按我定时器20ms来发的?
[/Quote]
//串口超时设置只是说明一次串口操作,如果达到了超时设置,串口将返回超时错误
//和你20ms一次的串口操作并没有什么关系。
//usb转串口,在发送接收过于频繁的情况下,常常会出错。能否达到20ms/次的发送,请在普通串口下测试。
wocow3 2009-01-06
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 akxu2006 的回复:]
为什么我把WriteTotalTimeoutMultiplier=1000;WriteTotalTimeoutConstant=5000;可是串口Writefile还是按我定时器20ms来发的?
[/Quote]
WriteFile是用的异步IO么,查看最后一个参数是否为NULL
hzcenter 2009-01-06
  • 打赏
  • 举报
回复
mark
akxu2006 2009-01-06
  • 打赏
  • 举报
回复
为什么我把WriteTotalTimeoutMultiplier=1000;WriteTotalTimeoutConstant=5000;可是串口Writefile还是按我定时器20ms来发的?
wocow3 2009-01-05
  • 打赏
  • 举报
回复
U转串的换肯定比普通的com口操作慢,毕竟中间多了一道工序
还是把WriteTotalTimeoutMultiplier//写超时系数,不要写0
WriteTotalTimeoutConstant//写超时常数
都扩大试试,给写操作多预留点时间
tiger波波 2009-01-05
  • 打赏
  • 举报
回复
跟缓冲区应该没关系。发送一半就停什么意思?停了为啥还有后边错误数据?

COMMTIMEOUTS结构如下:

typedef struct _COMMTIMEOUTS {
DWORD ReadIntervalTimeout;
DWORD ReadTotalTimeoutMultiplier;
DWORD ReadTotalTimeoutConstant;
DWORD WriteTotalTimeoutMultiplier;
DWORD WriteTotalTimeoutConstant;
} COMMTIMEOUTS,*LPCOMMTIMEOUTS;


ReadIntervalTimeout:两字符之间最大的延时,当读取串口数据时,一旦两个字符传输的时间差超过该时间,读取函数将返回现有的数据。设置为0表示该参数不起作用。

ReadTotalTimeoutMultiplier:读取每字符间的超时。

ReadTotalTimeoutConstant:一次读取串口数据的固定超时。所以在一次读取串口的操作中,其超时为ReadTotalTimeoutMultiplier乘以读取的字节数再加上ReadTotalTimeoutConstant。
将ReadIntervalTimeout设置为MAXDWORD,并将ReadTotalTimeoutMultiplier 和ReadTotalTimeoutConstant设置为0,表示读取操作将立即返回存放在输入缓冲区的字符。

WriteTotalTimeoutMultiplier:写入每字符间的超时。

WriteTotalTimeoutConstant:一次写入串口数据的固定超时。所以在一次写入串口的操作中,其超时为WriteTotalTimeoutMultiplier乘以写入的字节数再加上WriteTotalTimeoutConstant。
akxu2006 2009-01-05
  • 打赏
  • 举报
回复
是我没写清楚 我延时参数设置的是WriteTotalTimeoutMultiplier = 0;WriteTotalTimeoutConstant = 20; 发送的串口是用的USB转的虚拟串口 BAUD是230400;


qzf368 2009-01-04
  • 打赏
  • 举报
回复
友情up
wocow3 2009-01-04
  • 打赏
  • 举报
回复
//写总超时 :系数 * 字节数 + 常数
ptimeout->WriteTotalTimeoutMultiplier = 2; //写超时系数 :2ms
ptimeout->WriteTotalTimeoutConstant = 1000; //写超时常数 :1000ms

光设置了 总超时,没有设置超时系数
设置下WriteTotalTimeoutMultiplier 再试试

你的baud是多少,算算能达到你的速率么。

20ms 36 字节,每秒1800字节

9600baud,每秒才960字节(估算)
qq14923349 2009-01-04
  • 打赏
  • 举报
回复
TimeOuts.WriteTotalTimeoutMultiplier=100;
TimeOuts.WriteTotalTimeoutConstant=500;
SetCommTimeouts(hCom,&TimeOuts); //设置超时


TimeOuts.WriteTotalTimeoutMultiplier=100;这个是个字符要乘的数```
qq14923349 2009-01-04
  • 打赏
  • 举报
回复
WriteTotalTimeoutConstant

包括发送系数了吗?计算超时有两个属性的
API里面是
MSCOMM不清楚,难道合到一个属性了?
akxu2006 2009-01-04
  • 打赏
  • 举报
回复
应该不是字符的问题,我觉得可能是缓冲区的问题,因为我用WriteFile()每1S发一帧的话就一切正常,可是这样就没法满足20ms这个速度了
qq14923349 2009-01-04
  • 打赏
  • 举报
回复
怎么分就那么难赚呢
qq14923349 2009-01-04
  • 打赏
  • 举报
回复
http://blog.programfan.com/article.asp?id=40153

API的介绍
ME写的
qq14923349 2009-01-04
  • 打赏
  • 举报
回复
还好我用API

应该是发送超时了,但是后面字符不可能乱传,要查查'\0'位置,估计把你截断了
fandh 2009-01-04
  • 打赏
  • 举报
回复
不知道,帮顶!

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧