- 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/
来自 JSR-339: For simplicity, JAX-RS implementations are NOT REQUIRED to support processing groups oth
JAX-RS 提供了 StreamingOutput 接口(interface),我们可以实现它来对我们的响应主体进行原始流处理。 public interface StreamingOutput {
有没有办法获得java.lang.reflect.Method为给定的 @Path 调用的方法(用 HttpServletRequest 注释) ? 这是我的用例:我在 Java EE 中 Filte
我接到了一家公司的任务,该任务向我发送了一台已完成所有设置的虚拟机。任务是我必须创建一个 API 来从数据库中检索人员详细信息并显示它。 问题是,当我运行应用程序时,服务器返回一个包含 hello w
我有一个 POST 方法调用,它接受很少的表单参数。我希望 JAX-RS 能够处理不存在特定表单参数的情况。 示例: @POST @Produces (MediaType.APPLICATION_JS
我有 JAX-RS 网络应用程序,我想记录从获取请求到响应的时间量。在带有 servlet 过滤器的 Spring Boot 中很容易。但是我的应用程序中的过滤器无法正常工作: @Provider p
使用以下网址。 http://doma.in/context/resource/some/.../undefined 我想获取 ../resource 之后的路径名,即 /some/.../undef
Closed. This question is off-topic。它当前不接受答案。
我花了几个小时在嵌入式 Jetty 9.1.0.v20131115 和 RESTEasy 3.0.5.Final 中安装自定义登录服务。我的登录服务将在数据库中查找用户并为他们分配角色。它看起来像这样
RESOURCE_STALLS.RS的说明Intel Broadwell 的硬件性能事件如下: This event counts stall cycles caused by absence of
我想从 java 服务器 (Restful Jax-rs) 发送图像。我的客户是安卓。 @GET public Response getUserImage() { byte[] image =new
(特别是 RESTeasy) 具有如下方法签名会很好(对于单个文件): public void upload(@FormParam("name") ..., @FormParam("file") fi
RESTEasy (JAX-RS) 允许通过子资源进行动态调度。例如: POST /customers/create {"name":"Smith","country":"jp"} 我们可以有一个根资
假设有一个 ResultSet rs 和 n 对象。 这段代码: while(rs.next()) { // do something on rs } 在算法上等于此代码(即两者给出相同的结果)
我正在使用 Visual Studio 2005 和 mysql 4.0,我有一个表,其中包含一个字段(十进制 16,4),用于存储发票金额和另一个表,其中包含对该发票的付款(这些字段也是十进制的)
我正在使用 JAX-RS、Microprofile 和 Payara 5 构建 REST 服务。我的方法返回类型为 Response 的对象。响应本身包含一个 MyClass 列表。实现看起来像这样:
我已经使用 Mock MVC 成功地为 Spring MVC REST 服务构建了无需部署的集成测试框架。我正在努力对 JAX-RS 服务做同样的事情。 REST Assured 看起来很有希望,但它
我有一个使用JAX-RS 2.0的Jersey实现的Java应用程序,并且我想在客户端启用gzip压缩。服务器已启用它,并且通过在Chrome中的开发人员工具中的“大小/内容”中查找客户端正在使用的特
我正在尝试与 Tomcat7 一起使用 RESTful Web 服务 (JAX-RS)。我尝试了 3 种不同的实现(Jersey、RESTeasy 和 ReSTLet),但都没有成功。这应该很容易,但
swagger-api有什么区别和 JAX-RS ? 是swagger-api仅用于文档? (例如 @ApiOperation ) 最佳答案 根据 API 文档,JAX-RS是用于 RESTful W
我是一名优秀的程序员,十分优秀!