- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在使 8051 微 Controller 与计算机进行无线通信。微 Controller 将向其串行端口 (DB9) 发送一个字符串,计算机将接收该字符串并对其进行操作。
我的问题是我不知道如何让 8051 只传输一次字符串。因为我需要在 PC 端操作字符串,所以它只需要接收一次。目前,即使在 C 代码中我只发送一次字符串,但在我的计算机上我会连续接收相同的字符串。我假设这是因为 SBUF 中的任何内容都在不断传输。有什么方法可以只发送一次我的字符串吗?有没有办法清空SBUF?
我尝试使用 DB9 上的 RTS(请求发送)引脚(第 7 个引脚),因为我在某处读到如果我取消该引脚上的电压,它将停止数据流到串行端口。所以我所做的是对我的微 Controller 进行编程以发送字符串,然后将逻辑电平 0 发送到连接到我的 DB9 RTS 引脚的输出引脚。然而,这并没有奏效。
有人有什么建议吗?我真的很感激他们。
我在 PC 上使用的软件是用于 Xbee 模块的 X-CTU。这是我的微 Controller 上的代码:
include reg51.h
void SerTx(unsigned char);
void main(void)
{
TMOD = 0x20;
TH1 = 0xFD;
SCON = 0x50;
TR1 = 1;
SerTx('O');
SerTx('N');
SerTx('L');
SerTx('Y');
}
void SerTx(unsigned char x)
{
SBUF = x;
while(TI==0);
TI = 0;
}
有人可以验证它实际上只发送了一次字符串吗?
当 Steve、brookesmoses 和 Neil 说是在我的主要功能之后发生的事情导致了问题时,他们似乎一针见血。我刚刚尝试了 Steve 提出的建议代码(更具体地说是 for(;;); 并在 main 之外定义了 serTX)并且它工作得很好。 Controller 可能已重新启动,因此相同的代码不断重复。
非常感谢您的帮助! :)
最佳答案
你能确认8051真的只发送了一次数据吗?一种检查方法是使用示波器查看 UART 的 TX 引脚上发生了什么。
您在 PC 上使用什么软件?我建议使用简单的通信软件,如 HyperTerminal 或 PuTTY .如果他们多次显示正在发送到 PC 的字符串,则故障可能出在 8051 上运行的软件中。
编辑:老实说,这听起来像是工程师必须定期面对的调试,因此这是您练习老式方法问题的好机会-解决。
如果我可能很直率,我建议您执行以下操作:
编辑:我没有编辑问题的代表,所以这是 OP 在她的问题的评论中发布的代码:
#include<reg51.h>
void SerTx(unsigned char);
void main(void)
{
TMOD = 0x20; TH1 = 0xFD; SCON = 0x50; TR1 = 1;
SerTx('O'); SerTx('N'); SerTx('L'); SerTx('Y');
void SerTx(unsigned char x)
{ SBUF = x; while(TI==0); TI = 0; }
}
正如 Neil 和 Brooksmoses 在他们的回答中提到的,在嵌入式系统中,永远不允许 main 函数终止。因此,您要么需要将代码置于无限循环中(这可能是无意中发生的),要么在末尾添加无限循环,以便程序有效地停止。
此外,函数 SerTx 应该定义在 main 之外。这在语法上可能是正确的,但它使事情变得简单,而不是在其他函数中声明函数。
所以试试这个(我还添加了一些注释以使代码更容易理解):
#include<reg51.h>
void SerTx(unsigned char);
void main(void)
{
/* Initialise (need to add more explanation as to what
each line means, perhaps by replacing these "magic
numbers" with some #defines) */
TMOD = 0x20;
TH1 = 0xFD;
SCON = 0x50;
TR1 = 1;
/* Transmit data */
SerTx('O'); SerTx('N'); SerTx('L'); SerTx('Y');
/* Stay here forever */
for(;;) {}
}
void SerTx(unsigned char x)
{
/* Transmit byte */
SBUF = x;
/* Wait for byte to be transmitted */
while(TI==0) {}
/* Clear transmit interrupt flag */
TI = 0;
}
关于c - 如何仅从 8051 串行发送一次字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1216376/
我是一名优秀的程序员,十分优秀!