关于vb.net:8051 UART,串行接收字节

8051 UART, Receiving bytes serially

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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代码:

1
2
3
4
5
    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循环ant中合并" Sleep(20)",然后事情就可以了,但是我浪费了很多时间,因为每个字节需要不同的时间来处理,这将是无法接受的缓慢通信。

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

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


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

如果您需要有关硬件流控制的其他信息,请访问http://electronics.stackexchange.com。


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


过去的爆炸,我记得使用爆发盒对串行线路跟踪器进行调试。

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


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

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

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

这将使您可以在主机侧查看通信是否中断。回显的字符可能与发送的内容不匹配,从而使您警觉到问题。此外,如果主机在某个超时时间内未接收到字符,则主机可以尝试重新传输。最后,ACK / NAK使您可以选择返回状态,但是最重要的是,它将使主机知道您已完成操作并可以发送另一个命令。

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

此解决方案的优点在于,它不需要两端都需要额外的线路或UART支持就可以进行硬件流控制。