0

我必须从计算机(VB.NET)将文件逐字节发送到串行连接的 AT89s52。
每个发送的字节在微控制器中都有一些工作需要一些时间。
这是我的 C 代码中与接收字节相关的部分:

SCON = 0x50;
TMOD = 0x20; // timer 1, mode 2, 8-bit reload
TH1  = 0xFD; // reload value for 9600 baud
TR1  = 1;
TI   = 1;

again:

        while(RI!=0)
        {
            P1=SBUF;          // show data on led's
            RI=0;
            receivedBytes++;
        }

        if (key1==0)
        {
            goto exitreceive; // break receiving
        }

        show_lcd_received_bytes(receivedBytes); 
        // here is one more loop 
        // with different duration for every byte
        goto again;

这是用于发送字节的 VB.NET 代码:

    For a As Integer = 1 To 10
        For t As Integer = 0 To 255
            SerialPort1.Write(Chr(t))
        Next t
    Next a

问题是 mC 在每个接收到的字节之后都有一些工作要做,而 VB.NET 不知道这一点并且发送字节太快,所以在 mC 中只完成了所有字节的一部分(大约 10%)。我可以在 VB loop ant 中加入“Sleep(20)”然后事情会起作用,但是我浪费了很多时间,因为每个字节都需要不同的时间来处理,这将是不可接受的缓慢通信。

现在,我的问题是 8051 是否可以在 UART 上设置一些繁忙状态,VB 在发送之前可以读取这些状态来决定是否发送字节。或者如何以其他方式设置所描述的此类通信?我还尝试在 mC 端接收带有串行中断的字节,结果相同。

硬件肯定没问题,因为我可以很好地将数据发送到计算机(如预期的那样)。

4

4 回答 4

1

正如@TJD 提到的,硬件流控制可用于在微型计算机处理接收到的字节时阻止 PC 发送字符。过去,我通过使用可用端口线作为输出来实现硬件流。输出需要连接到 TTL 到 RS-232 驱动器(如果您当前使用的是 RS-232,您可能有额外的驱动器可用)。如果您使用 USB 虚拟串行端口或 RS-422/485,则需要实现软件流控制。通常会发送一个 control-S 来告诉 PC 停止发送,并发送一个 control-Q 来继续。为了充分利用流控制,您很可能还需要实现完全中断驱动的 FIFO 来接收/发送字符。

如果您想了解有关硬件流控制的更多信息,请查看http://electronics.stackexchange.com

于 2012-08-11T03:09:02.727 回答
1

过去的爆炸,我记得使用接线盒来调试这种东西的串行线路跟踪器。

通过串行通信,如果您使用了所有引脚/线,则通过 RTS(准备发送)和 DTR(数据终端就绪)进行流量控制,用于在可以发送更多数据时发出信号。您是否可以控制通过 C 编码的设备中的内容?在 VB.NET 中,有用于接收这些信号的事件,或者可以使用 SerialPort 对象上的属性来查询它们。

于 2012-08-10T12:05:57.263 回答
1

你的问题是架构问题。不要尝试在处理字节 Rx 的中断中对接收到的数据进行处理。让你的字节 Rx 中断只将接收到的字节复制到一个单独的 Rx 数据缓冲区,并有一个后台任务来执行传入数据的实际处理而不阻塞 Rx 中断处理程序。如果由于整体吞吐量问题而无法跟上,那么 RTS/CTS 流控制是合适的机制。例如,当您的 Rx 缓冲区已满 90% 时,取消断言流控制信号以暂停发送端。

于 2012-08-10T17:07:02.960 回答
0

很多这些答案都建议使用硬件流控制,但您也可以选择通过使用软件流控制来增强传输以更加健壮。目前,您的通信很强大,但如果您开始运行更高的波特率或更长的距离,甚至只是有一个嘈杂的连接,则可能会接收到不正确的字符,或者可能会丢失字符。

您可以在完成任何设置为发生的操作后添加一个简单的两字节 ACK 序列。它可能看起来像这样:

主机发送命令字节:<0x00> 设备回显命令字节:<0x00> 设备执行所需的任何操作 设备发送 ACK/NAK 字节(基于结果):

如果通信中断,这将允许您在主机端查看。回显的字符可能与发送的内容不匹配,这会提醒您注意问题。此外,如果主机在某个超时时间内没有接收到字符,主机可以尝试重新传输。最后,ACK/NAK 为您提供了返回状态的选项,但最重要的是它会让主机知道您已经完成了操作并且它可以发送另一个命令。

这可以扩展为包括校验和,以便为设备提供一种验证接收到的命令是否有效的方法(与命令字节一起发送的简单逻辑逆就足够了)。

此解决方案的优点是它不需要额外的线路或任何一端的 UART 支持来进行硬件流控制。

于 2012-08-22T18:22:01.433 回答