Mar*_*ort 3 microcontroller winapi serial-port break
是否有更好的方法来发送串行中断然后是setcommbreak - delay - clearcommbreak序列?
我必须与一个微控制器通信,该微控制器使用串行中断作为115k2上数据包的开始,而setcommbreak有两个问题:
115k2,突破远低于1ms,它将获得时间关键.
由于中断必须嵌入在正确位置的数据包流中,我预计fifo会出现问题.
有没有更好的方法来做到这一点,而没有将串行通信移动到没有fifo的线程?UART通常为16550+
我可以选择微控制器设置可以切换(其他固件)为更常规的数据包格式,但手册警告说,"中断"方式具有串行硬件完整性检查功能.
编译器是Delphi(2009/XE),但欢迎使用任何代码或甚至只是参考.
简短的回答是Windows的串行编程相当有限:-(
你是正确的,发送休息的正常方式是SetCommBreak()
,并且是的,你必须自己处理延迟 - 这往往意味着休息的结束时间远远超过它需要的时间.好消息是,这通常并不重要 - 大多数期望休息的设备会以与短期休息完全相同的方式处理更长时间的休息.
如果您的微控制器对中断的精确持续时间非常挑剔,那么实现更短,精确定义的中断的一种方法是将端口上的波特率更改为更慢的速率,发送零字节,然后将其更改回来再次.
这样做的原因是发送到串行端口的字节(通常)发送一个起始位(零),然后是字节中的位,后跟一个或多个停止位(高位).'break'是一个零位序列,它太长而不能成为一个字节 - 即停止位不及时到来.通过选择较慢的波特率并发送零,您最终将该行保持为零的时间比接收器期望的字节长,因此它将其解释为中断.(这取决于您是否通过精确计算确定要使用的波特率或微控制器似乎喜欢的反复试验:-)
当然,任何一种方法(SetCommBreak()
或波特率改变)都要求您知道何时所有数据都已从串行端口发出(即发送FIFO中没有任何内容).这个漂亮的有关Windows串行编程本文介绍如何使用SetCommMask()
,WaitCommEvent()
等来确定这一点.
归档时间: |
|
查看次数: |
2001 次 |
最近记录: |