gpt4 book ai didi

c - 如何仅从 8051 串行发送一次字符串?

转载 作者:太空狗 更新时间:2023-10-29 17:17:08 25 4
gpt4 key购买 nike

我正在使 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 上运行的软件中。

编辑:老实说,这听起来像是工程师必须定期面对的调试,因此这是您练习老式方法问题的好机会-解决。

如果我可能很直率,我建议您执行以下操作:

  1. 调试。尝试一下,但不要猜测。实验。对您的代码做一些小改动,看看会发生什么。尝试一切你能想到的。在网络上搜索更多信息。
  2. 如果这没有产生解决方案,请返回这里,并向我们提供我们需要的所有信息。这包括相关代码片段、您正在使用的硬件的完整详细信息,以及有关您在第 1 步中尝试的内容的信息。

编辑:我没有编辑问题的代表,所以这是 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com