在这个项目之前,我没有使用控制器区域网络 (CAN) 或 ValueCAN3 的经验,我使用 Intrepid 的一个示例来阅读消息。但是,我在显示我正在读取的模拟和数字信号的 GUI 的更新效率和频率方面存在问题。
我的 GUI 由 16 个用于模拟通道的数字上/下框和 36 个按钮组成,这些按钮会根据数字信号是打开 (1) 还是关闭 (0) 而变为绿色。在阅读我的 CAN 消息时,我会更新 GUI 控件以显示适当的反馈。然而,当我按下插入的 CAN 操纵杆上的按钮时,数字通道几乎会立即响应,而模拟信号不会随着我用来改变信号的弦壶而快速更新。有时模拟信号需要 1 - 2 秒才能响应。
目前我设置了 GUI 控件,然后我从 GUI 控件中读取值并通过套接字连接通过 UDP 将值发送到另一个应用程序。我可能应该将其更改为从我直接接收的信号中发送数据,而不是从我正在设置的 GUI 控件中读取数据,但我认为这不是问题所在。
我正在使用 System::Timers::Timer 对象来更新、读取消息和发送数据包。我需要 50hz - 100hz 的速率,最好接近 100hz。使用另一端的套接字,我可以看到我的数据包被发送得足够频繁,但是模拟通道的数据变化并不平滑或频繁。如果有人对我可能做错了什么有任何想法,或者如何以更有效的方式处理数据,请说明。
这是 Intrepid 读取 CAN 消息的代码段:
// Read the messages every timer event (1000 ms)
if (m_bPortOpen) // only if the port is open
{
// call icsneoGetMessages to read out the messages
lResult = icsneoGetMessages(hObject,stMessages,&lNumberOfMessages,&lNumberOfErrors);
if (lResult != 0)
{
// a successful read
mNumberOfErrorsRead = lNumberOfErrors;
mNumberOfMessagesRead = lNumberOfMessages; // store the number of messages in the current buffer
}
}
我的表单使用以下方法从我的 CanReader 对象请求一条消息:
msg = can->GetLatestMsg();
并且该方法获取收到的最后一条消息。
public: icsSpyMessage* GetLatestMsg()
{
return &stMessages[mNumberOfMessagesRead - 1];
};
我认为这个 GetLatestMsg() 似乎是实现检索最新消息的不好方法,但我不完全确定这对我的程序有多大影响,或者我还能如何做到这一点,因为 CanReader 与 Form 是分开的所以我必须传递一系列我认为否则的消息。我确实怀疑这可能会跳过消息,因为它只读取最后一个抓取的消息,而不是导致它的消息,如果读取这些消息,应该会使 GUI 输出在过渡时显得更平滑。
另一件要注意的是,我正在从 6 个不同的 PGN 中读取数据,模拟信号对应于 4 个 PGN,2 个对应于数字信号。
更新
在玩过我的应用程序并在不同的模拟通道上使用弦乐壶之后,我注意到一些通道比其他通道更新得更多。通过检查正在访问的 PGN,我发现我访问的 PGN 比其他 PGN 更频繁。
CAN 设备不是以相对相同的速率为不同的 PGN 广播数据吗?如果是,那么我的 GetLatestMsg() 方法一定不能有效地读取不同的 PGN。它每 5 毫秒读取一个新的 msg。
此外,有谁知道我是否应该制作单独的阅读计时器来分别检测不同的 PGN?
如果有其他代码我可以提供清晰的说明,请告诉我。