所以我有一个奇怪的问题。我使用LAN与微控制器进行通信。一切都很完美。含义:我可以发送和接收数据。为了使用一个简单的方法接收数据,Thread.sleep(1)
在for
循环中我client.GetStream().DataAvailable
检查client
为真TcpClient
是client.GetStream().DataAvailable
1}}
现在,通过一个过程,我必须以更高的波特率发送和接收微控制器。我使用9600进行所有其他操作,一切都很好。现在有了115200 false
似乎总是有值using (client = new TcpClient(IP_String, LAN_Port))`
{
client.SendTimeout = 200;
client.ReceiveTimeout = 200;
stream = client.GetStream();
.
.
bool OK = false;
stream.Write(ToSend, 0, ToSend.Length);
for (int j = 0; j < 1000; j++)
{
if (stream.DataAvailable)
{
OK = true;
break;
}
Thread.Sleep(1);
}
.
.
}
。
可能是什么问题?
PS:与微控制器通信的另一种方式(全部由用户选择)是串行通信。对于更高的波特率,这仍然可以正常工作。
以下是代码段:
DataAvailable
编辑:
在监视与列表设备的通信时,我意识到这些位实际到达并且设备实际应答。唯一的问题似乎是<div id="hoogte" style="clear:both">
<h1>Blijf op de hoogte</h1>
</div>
标志没有被提出。我应该找到另一种检查数据可用性的方法。有什么想法吗?
答案 0 :(得分:1)
我一直试图想一想我以这种方式行事的事情......
我已经看到串行芯片说他们会做115,200,但实际上不会。看看如果将波特率降低一级会发生什么。无论哪种方式,你都会学到一些东西。
一些微控制器&#34; bit-bang&#34;串行端口通过让CPU升高和降低数据引脚并基本上通过位,将1或0敲入串行引脚。当一个字节进来时,他们会读取它,并做同样的事情。 这确实省钱(没有串行芯片),但实际上可靠地工作是绝对地狱般的噩梦。 115,200可能会过分努力。
这可能是一个微妙的微控制器问题。假设你有一个接收串行芯片,当一个字节进入时断言一个引脚,通常类似于DRQ *用于&#34;数据请求&#34; (DRQ *中的*表示0伏是&#34;我们有一个字节&#34;条件)(c&#39; mon,人,a * isn总是指针:-)。那么,DRQ *请求中断,固件和放大器。 CPU中断,它读取串行芯片的字节,并将其存入一些方便的内存缓冲区。然后它从中断返回。
如果您非常快速地获取数据,则可能会出现问题。让我们假设数据已进入,串行芯片得到一个字节(&#34;#1&#34;在本例中),断言DRQ *,我们中断,固件抓取并存入字节#1,并从打断。一切都很好。但是想想如果另一个字节在中出现,而第一个中断仍然在运行时会发生什么。串行芯片现在有#2字节,因此它再次断言已经断言的DRQ *引脚。第一个字节的中断完成。怎么了? 你挂了。
这是因为它是DRQ *的-edge-,物理上从5V到0V,实际上会导致CPU中断。在第二个字节上,DRQ *从0开始并设置为0.因此DRQ *(仍然)被置位,但是没有-edge-告诉中断硬件/ CPU另一个字节正在等待。当然,现在,所有其他传入数据也都会被删除。
了解为什么它在更高的速度下变得更糟?中断例程越来越快地处理数据,并且通常在中断处理程序中进行循环I / O缓冲计算,并且它必须快速有效,因为快速输入可以将中断处理程序推送到全新字节进入之前中断结束。
这就是为什么在中断处理程序中检查DRQ *以查看另一个字节(#2)是否已经在等待(如果是这样,只是读入它,以清除串行芯片&#39; s DRQ *,然后将字节存入内存中),或使用&#34;级别触发&#34;中断,而不是&#34;边缘触发&#34;。边缘触发肯定有很好的用途,但你需要注意这一点。
我希望这会有所帮助。这肯定花了我足够长的时间才弄明白。现在我非常关心这样的事情。
祝你好运,让我知道它是怎么回事。