我想为嵌入式系统编写C代码,这样在RS232端口接收的数据应该被连续读取,而不需要为读取数据创建单独的"RS232任务“。
有人能帮我吗?
我只需要一种基本的方法来读取数据,而不需要创建任务。
发布于 2021-12-08 23:44:59
标识告诉您是否接收到某些数据的函数。通常,它返回一个布尔值或接收到的字节数。(顺便说一句,RS232上的大多数协议允许每次传输5到8位数据。)
在条件块中使用该函数调用实际读取一个或多个接收字节的下一个函数。如果没有收到任何信息,这将阻止循环阻塞。
示例(在您的示例中不知道函数是如何命名的):
/* any task */ {
for (;;) /* or any other way of looping */ {
/* do some stuff, if needed */
if (areRs232DataAvailable()) {
uint8_t data = fetchRs232ReceivedByte();
/* handle received data */
}
/* do some stuff, if needed */
}
}
发布于 2021-12-10 22:51:42
我会问,为什么您认为从UART读取数据(我认为这就是您所说的"RS-232")需要一项任务?解决方案将在很大程度上取决于您的平台和环境,除了FreeRTOS之外,您还没有指定它,它不提供任何串行I/O支持。
如果您的平台或设备库已经包含了串行I/O,那么您可以使用它,但是在非常低的级别,UART将拥有一个状态寄存器和一个包含该数据的寄存器或FIFO。您可以简单地轮询数据可用性,然后读取数据。
为了避免在处理器忙于其他任务时丢失数据,您可以使用中断或DMA。至少,UART能够在接收到字符时产生中断。中断处理程序将新数据放入FIFO缓冲区(例如RTOS消息队列),并将接收从缓冲区异步读取的串行数据的任务。
DMA的工作方式类似,但是您可以对数据进行排队,以响应DMA中断。这将降低中断速率,但您必须处理部分完整DMA缓冲区无限期等待的可能性。而且,并不是所有的平台都必须支持作为DMA源的UART,甚至根本不支持DMA。
https://stackoverflow.com/questions/70285415
复制相似问题