winapi - 使用 Windows (XP+) api 发送(串行)中断

标签 winapi serial-port microcontroller break

有没有比 setcommbreak -delay -clearcommbreak 序列更好的方法来发送串行中断?

我必须与使用串行中断作为 115k2 上数据包开始的微 Controller 进行通信,并且 setcommbreak 有两个问题:

  • 对于 115k2,中断远低于 1ms,并且它对时序至关重要。

  • 由于中断必须嵌入数据包流中的正确位置,因此我预计 fifo 会出现问题。

有没有更好的方法来做到这一点,而不将串行通信移动到没有 fifo 的线程? UART通常是16550+

我可以选择将微 Controller 设置(其他固件)切换为更常规的数据包格式,但手册警告说“中断”方式具有串行的硬件完整性检查功能。

编译器是Delphi (2009/XE),但欢迎任何代码,甚至只是引用。

最佳答案

简短的回答是,使用 Windows 进行串行编程相当有限:-(

您说得对,发送中断的正常方法是使用 SetCommBreak(),是的,您必须自己处理延迟 - 这往往意味着中断最终会比必须如此。好消息是,这通常并不重要 - 大多数期待中断的设备都会以与短中断完全相同的方式处理较长的中断。

如果您的微 Controller 对中断的精确持续时间很挑剔,实现更短、精确定义的中断的一种方法是将端口上的波特率更改为较慢的速率,发送一个零字节,然后再次将其改回来。

这样做的原因是发送到串行端口的字节(通常)作为一个起始位(零)发送,后跟字节中的位,然后是一个或多个停止位(高位) 。 “中断”是一个零位序列,它太长而不能成为一个字节 - 即停止位没有及时出现。通过选择较慢的波特率并发送零,您最终将线路保持为零的时间比接收器预期的字节时间长,因此它将其解释为中断。 (由您决定是否通过精确计算或微 Controller 似乎喜欢的试错来确定要使用的波特率:-)

当然,无论哪种方法(SetCommBreak() 或波特率更改)都要求您知道所有数据何时已从串行端口发送出去(即发送 FIFO 中没有剩余数据)。这很好article about Windows Serial programming描述了如何使用 SetCommMask()WaitCommEvent() 等来确定这一点。

关于winapi - 使用 Windows (XP+) api 发送(串行)中断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4585661/

相关文章:

winapi - VB6 从 IP 查找主机名,指定 DNS 服务器

multithreading - 有没有比mciSendString更好的播放Mp3的方法了?

c - 如何打开读/写线颠倒的串口?

c - 用于不同大小阵列的 UART DMA

java - 如何在android中以编程方式查找网络上其他WiFi设备的IP地址

c++ - 将丰富的编辑控件中的整个文本作为 CString 获取的各种方法

windows - 对于超过 32 个内核的系统,如何替换 SetProcessAffinityMask()/GetProcessAffinityMask()?

c - 实现 Com 端口终端的最简单方法。 ( Windows ,C)

c++ - Arduino:Serial.find(char) 不工作

c - LPC1788 微 Controller 的内存分配问题