- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试通过串行端口使用 RS-485 与设备通信。一切正常,直到我们试图加强通信以测试卡的速度限制,然后似乎出现了奇怪的问题。我们基本上是发送一个带有图像作为参数的第一个命令,然后发送另一个命令来显示该图像。每次命令后,卡片都会回答说命令已收到。但我们很快就达到了极限,而且该卡应该可以处理更多。
所以我想知道,由于传输和接收是通过同一条线路进行的,是否存在某种数据冲突?我应该等待接收所有数据吗?在这种情况下,SerialDataReceivedEventHandler 是否太慢了?我是否应该在单独的线程中继续读取 while true 循环中的字节,并在收到完整消息后向其他线程发出信号?
其他信息:
我知道 SerialPort 编程不是我的强项,我一直在努力寻找某种包装器,但我还没有找到任何适合我需要的东西。如果有人向我提出建议,那就太好了,或者也许有人知道哪里出了问题。无论如何,这里有一些编码:
线程发送帧数:
public void SendOne()
{
timerLast = Stopwatch.GetTimestamp();
while (!Paused && conn.ClientConnState == Connexion.ConnectionState.Connected)
{
timerNow = Stopwatch.GetTimestamp();
if ((timerNow - timerLast) / (double)Stopwatch.Frequency >= 1 / (double)fps)
{
averageFPS.Add((int)((double)Stopwatch.Frequency / (timerNow - timerLast)) + 1);
if (averageFPS.Count > 10) averageFPS.RemoveAt(0);
timerLast = Stopwatch.GetTimestamp();
if (atFrame >= toSend.Count - 1)
{
atFrame = 0;
if (!isLoop)
Paused = true;
}
SendColorImage();
}
}
public void SendColorImage()
{
conn.Write(VIP16.bytesToVIP16(0x70C1, VIP16.Request.SendImage, toSend[++atFrame]));
WaitForResponse();
conn.Write(VIP16.bytesToVIP16(0x70C1, VIP16.Request.DisplayImage, VIP16.DisplayOnArg));
WaitForResponse();
}
private void WaitForResponse()
{
Thread.Sleep(25);
}
所以 WaitForResponse() 是至关重要的,因为如果我在卡片回答之前发送另一个命令,它就会发疯。尽管我讨厌使用 Thread.Sleep(),因为它不是很准确,而且它会将我的速度限制在 20fps,而且如果我使用低于 25ms 的东西,则更有可能发生崩溃的风险。所以我打算将 Thread.Sleep 更改为“读取字节直到接收到整个消息”并忽略 DataReceivedEvent...只是想知道我是否完全偏离了轨道?
非常感谢!
更新 1
首先感谢 Brad 和 500 - 内部服务器错误!但我决定暂时坚持使用 .NET 串行端口并提高 Thread.Sleep 的准确性(使用 timebeginperiod)。我决定等待收到完整的响应,并像这样使用 ManualResetEventSlim(为了速度)同步我的线程:
public static ManualResetEventSlim _waitHandle = new ManualResetEventSlim(false);
然后我将 SendColorIMage 更改为:
public void SendColorImage()
{
conn.Write(VIP16.bytesToVIP16(0x70C1, VIP16.Requetes.SendImage, toSend[++atFrame]));
WaitForResponse();
conn.Write(VIP16.bytesToVIP16(0x70C1, VIP16.Requetes.DisplayImage, VIP16.DisplayOnArg));
WaitForResponse2();
}
private void WaitForResponse()
{
Connexion._waitHandle.Wait(100);
Thread.Sleep(20);
}
private void WaitForResponse2()
{
Connexion._waitHandle.Wait(100);
//Thread.Sleep(5);
}
使用 SerialDataReceivedEventHandler 调用:
public void Recevoir(object sender, SerialDataReceivedEventArgs e)
{
if (!msg.IsIncomplete)
msg = new Vip16Message();
lock (locker)
{
if (sp.BytesToRead > 0)
{
byte[] byteMsg = new byte[sp.BytesToRead];
sp.Read(byteMsg, 0, byteMsg.Length);
msg.Insert(byteMsg);
}
}
if (!msg.IsIncomplete)
{
_waitHandle.Set();
if (MessageRecu != null)
MessageRecu(msg.toByte());
}
}
所以我发现在第二个命令之后我根本不需要调用 Thread.Sleep...在第一个命令之后我需要至少休眠 20 毫秒以使卡不崩溃。所以我想这是卡需要接收/处理整个图像到它的像素的时间。并且数据冲突不应该真正发生,因为我一直等到整个消息到达,这意味着问题不在我这边!是的! :p
最佳答案
一些提示:
发送后,您需要等待传输缓冲区空事件,然后再读取响应。它是非托管的 EV_TXEMPTY,我不记得它是如何封装在托管端的 - 我们的 RS485 代码早于 .NET comport 组件。
您可以使用 timeBeginPeriod(1) 调用对定时器芯片进行重新编程,以在 Thread.Sleep() 上获得 1 毫秒的分辨率。
值得一提的是,我们在发送后仅短暂休眠(1 毫秒),然后进入读取循环,我们不断尝试从端口读取(同样,读取尝试之间有 1 毫秒的延迟),直到已收到完整响应(或直到超时或重试计数器耗尽)。
这是 timeBeginPeriod 的导入声明 - 我认为它不能直接在 .NET 中使用(还?):
[DllImport("winmm.dll")]
internal static extern uint timeBeginPeriod(uint period);
希望对您有所帮助。
关于c# - SerialPort RS-485 和通信限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6127623/
我有一个 ServiceBusQueue(SBQ),它获取大量消息负载。我有一个具有 accessRights(manage) 的 ServiceBusTrigger(SBT),它不断轮询来自 SBQ
在下面给出的结果集中,有 2 个唯一用户 (id),并且查询中可能会出现更多此类用户: 这是多连接查询: select id, name, col1Code, col2Code, col2Va
我正在用 Python 2.7.3 编写一个带有 GRequests 的小脚本和 lxml 可以让我从各种网站收集一些收藏卡价格并进行比较。问题是其中一个网站限制了请求的数量,如果我超过它,就会发回
我想知道何时实际使用删除级联或删除限制以及更新级联或更新限制。我对使用它们或在我的数据库中应用感到很困惑。 最佳答案 在外键约束上使用级联运算符是一个热门话题。 理论上,如果您知道删除父对象也将自动删
下面是我的输出,我只想显示那些重复的名字。每个名字都是飞行员,数字是飞行员驾驶的飞机类型。我想显示驾驶不止一架飞机的飞行员的姓名。我正在使用 sql*plus PIL_PILOTNAME
我正在评估不同的移动框架,我认为 nativescript 是一个不错的选择。但我不知道开发过程是否存在限制。例如,我对样式有限制(这并不重要),但我想知道将来我是否可以有限制并且不能使用某些 nat
我正在尝试使用 grails 数据绑定(bind)将一些表单参数映射到我的模型中,但我认为在映射嵌入式集合方面可能存在一些限制。 例如,如果我提交一些这样的参数,那么映射工作正常: //this wo
是否可以将 django 自过滤器起的时间限制为 7 天。如果日期超过 7 天,则不应用过滤器 最佳答案 timesince 的源代码位于 django/django/utils/timesince.
我想在我的网站上嵌入一个 PayPal 捐赠按钮。但问题是我住在伊朗——这个国家受到制裁,人们不使用国际银行账户或主要信用卡。 有什么想法吗?请帮忙! 问候 沮丧 最佳答案 您可以在伊朗境内使用为伊朗
这是我的查询 select PhoneNumber as _data,PhoneType as _type from contact_phonenumbers where ContactID = 3
这个问题在这里已经有了答案: What is the maximum number of parameters passed to $in query in MongoDB? (4 个答案) 关闭
我的一个项目的 AndroidManifest.xml 变得越来越大(> 1000 行),因为我必须对某些文件类型使用react并且涵盖所有情况变得越来越复杂。我想知道 list 大小是否有任何限制。
在使用 Sybase、Infomix、DB2 等其他数据库产品多年后使用 MySQL 5.1 Enterprise 时;我遇到了 MySQL 不会做的事情。例如,它只能为 SELECT 查询生成 EX
这个问题在这里已经有了答案: What is the maximum number of parameters passed to $in query in MongoDB? (4 个回答) 关闭5年
通常我们是在{$apache}/conf/httpd.conf中设置Apache的参数,然而我们并没有发现可以设置日志文件大小的配置指令,通过参考http://httpd.apache.org/do
我正在搜索最大的 Android SharedPreferences 键值对,但找不到任何好的答案。其次,我想问一下,如果我有一个键,它的字符串值限制是多少。多少字符可以放入其中。如果我需要频繁更改值
我目前正在试验 SoundCloud API,并注意到我对/tracks 资源的 GET 请求一次从不返回超过 200 个结果。关于这个的几个问题: 这个限制是故意的吗? 有没有办法增加这个限制? 如
我正在与一家名为 Dwolla 的金融技术公司合作,该公司提供了一个 API,用于将银行信息附加到用户并收取/发送 ACH 付款。 他们需要我将我的 TLS 最低版本升级到 1.2(禁用 TLS 1.
我在 PHP 中有一个多维数组,如下所示: $array = Array ( [0] => Array ( [bill] => 1 ) [1] => Array ( [
我在获取下一个查询的第一行时遇到了问题: Select mar.Title MarketTitle, ololo.NUMBER, ololo.Title from Markets mar JOIN(
我是一名优秀的程序员,十分优秀!