我正在尝试使微 Controller 与桌面上的程序进行通信。我在两端都使用带有 Xbee radio 的串行端口连接。
当我从微 Controller 向桌面发送一些东西并且桌面上的程序然后将一些东西发送回微 Controller 时,通信工作正常。
但是,当我要求将信息从 Controller 连续发送到桌面程序直到桌面程序发送特定答案时,它不起作用。
这是我正在谈论的代码:
unsigned char ans = 'N';
unsigned int count = 0;
void main(void)
{
while(1)
{
if(count == 0)
{
Configure();
count = 1;
}
//there is some more code here but is irrelevant to the serial communication
}
}
void Configure()
{
//Repeat this until the user accepts the sent string as correct
while(ans == 'N')
{
BuildString();
Send();
Receive();
}
}
void Send()
{
unsigned int i;
TMOD = 0x20;
TH1 = 0xFD;
SCON = 0x50;
TR1 = 1;
for(i=0; i<4; i++)
{
SBUF = toSend[i];
while(TI == 0);
TI = 0;
}
}
void Receive()
{
unsigned int j;
TMOD = 0x20;
TH1 = 0xFD;
SCON = 0x50;
TR1 = 1;
for(j=0; j<2; j++)
{
while(RI == 0);
Received[j] = SBUF;
RI = 0;
}
if(count == 0)
ans = Received[1];
else
{
RunType = Received[0];
Move = Received[1];
}
}
BuildString() 函数只是根据一些传感器输入构造一个字符串。
发送和接收函数通常工作正常,但是当我需要它们连续发送和接收时,就像上面的 Configure() 函数一样,它不起作用。
有什么建议么?我真的很感激他们。
最佳答案
问题是您的发送和接收功能都被轮询和阻塞。当你调用接收函数时,它只会在接收到完整的消息后返回。发送功能的同上,但在发送的情况下,持续时间可能会更短(您的程序可能只会在有消息要发送时调用发送,而接收可以等待消息到达之前的几天。
如果需要异步通信,最好使用基于中断的通信;至少对于接收,理想情况下对于发送和接收都是如此。
也可以使用轮询通信来实现这一点,但是您需要编写一个函数来检查字符是否可用于接收(或 tx-empty),以从缓冲区读取/写入下一个字符。
基于中断的通信的优点是:
作为第一步,我建议您实现(或获取)基于中断的接收;即使传输功能仍然受阻,它也可以轻松实现全双工操作。如果您没有操作系统(rtos/scheduler),您将不得不考虑同步机制。最简单的形式是让您的接收者处理一条消息(如果有可用消息),如果没有(完整)消息则立即返回。
祝你好运。
评论后编辑
在逐条消息的基础上,如果桌面对 Controller 发送的消息使用react,事情似乎可以正常工作。如果您的 Controller 在接收时有一个大的 FIFO 缓冲区(即 64 字节),这可能会起作用。我知道的大多数 Controller 都没有这个。许多只有一个字符缓冲区。您可以使用寄存器中的 OVERFLOW 位检测到这一点;如果设置了此项,则接收时字符会丢失。
一些用例:
* 您想一次性发送 2 条消息(例如:init + do_something)。 pc 响应第一个 msg,但 Controller 仍在发送并丢弃大部分数据。
* PC 在 Controller 执行 receive() 函数之前开始发送。数据包开头的数据可能会丢失
* 任何通信中断都可能导致死锁(即 Controller 和桌面都在等待另一端发送内容。
所以要诊断:检查溢出位。如果它被设置,你已经丢失了数据,你需要处理中断函数。如果可能,监控双方(至少是状态;例如,一个 LED 闪烁表示发送,一个 LED 表示接收)。
一个 rs232 监视器可以帮助你(你需要一些额外的端口。有很多(包括免费软件)应用程序可以监视多个 rs232 端口并提供时间戳。所以你可以观察通信的顺序。谷歌找到了我:link;在过去的几年中,我使用了几个类似的实用程序。
关于embedded - 如何在 8051 中使用无线串口连续发送和接收?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1618793/