Dre*_*pin 7 c++ windows sleep serial-port
我正在编写一个IO类,通过RS-232串口上传/下载文件到控制器.不幸的是,我无法一次发送整个文件,我必须将其分解为数据包并一次发送一点.这是基本方法......
ifstream file ("path/to/file.ext", ios::in | ios::binary);
while( !file.eof() )
{
//... zero buffer, and add packet header (8 bytes)
size_t nResult = file.read( &buffer[8], 129 );
Serial.Write( buffer, nResult+8 );
//... see if controller wrote anything to the serial port and process it's command
Sleep( 600 );
}
Run Code Online (Sandbox Code Playgroud)
我知道使用Sleep()不是一个好的设计实践,但如果我删除Sleep()语句甚至缩短循环休眠的时间,那么控制器会抛出有关它的缓冲区已满的错误,并且传输失败.有一个更好的方法吗?
在您说出之前,我不能向控制器发送消息以确定它是否已准备好接收下一个数据包.它没有这个功能.
编辑: 我忘了提到我不得不睡觉的时间间隔有些"失明".制造商提供的协议规范没有详细说明数据包之间所需的任何时间长度.所以我必须通过反复试验来确定这个价值.我担心它可能无法在每台PC上运行,因此它可能无法在每个控制器上运行.
这项开发正在针对Windows XP/Vista/7进行.
编辑#2: 此外,每个数据包的数据量实际上也是一个试错误猜测.协议规范允许65,535字节的数据包(包括标头).但是如果你一次发送超过129个字节,你就会开始看到有时它可以工作的问题,有时则不会.您必须睡眠的时间与您可以发送的字节数之间似乎存在关系.如果我将数据包大小减少到每个数据包20个字节,我可以将睡眠时间减少到400毫秒.我相信这些问题的原因源于控制器将数据从缓冲区移动到文件所花费的时间.
Jos*_*ine 10
你正在做的是盲周期同步.它不一定是糟糕的设计.如果您的设备没有表明它已准备好接收更多数据的功能,则这是唯一的方法.
设备通常指定最大数据速率或字节之间的最小时间量.
我认为这种做法不好的想法来自于你盲目选择一个延迟值的情况(如果它比它需要的大,性能会受到影响),如果你有更好的同步方法,或者你正在使用延迟覆盖计时问题(例如,在多线程应用程序中).