【发布时间】:2012-08-10 11:37:41
【问题描述】:
我必须从计算机 (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 端接收带有串行中断的字节,结果相同。
硬件肯定没问题,因为我可以很好地将数据发送到计算机(如预期的那样)。
【问题讨论】:
-
通讯正常时为什么要降低波特率?
-
当你因为微控制器跟不上而丢失90%的数据时,你通常不会说“通信正常”。
-
在这种情况下,波特率不是数据丢失的原因,而是通信控制丢失的原因。这样,对于某些 mC 中的操作,150 bps 的速度可能会太高,而对于某些 19k,则可以接受。是的,通过将数据从 mC 发送到计算机可以看到,通信正常进行。
-
您的计算机不会有跟不上的问题,它的计算能力比您的 uC 高出几个数量级。还有一个带有 FIFO 的 UART。以及出色的中断处理程序。因此,看到从 uC 到计算机没有数据丢失并不意味着什么,问题恰恰相反。
-
如果你不想降低波特率,那么中断处理程序是最重要的,你不能强迫对方足够快地停止发送。你需要一个协议。一个简单的方法是您接受命令并在完成命令后发回一些东西。我想你已经知道了,真正的问题还不清楚。
标签: vb.net serial-port microcontroller 8051