最近做一个项目,下位机是单片机,上位机程序采用c# Winform窗体应用程序。采用485通信协议,C#端采用SerialPort类实现数据收发。协议都没有问题,现在有一个情况我不能确定,想请教各位大神帮忙处理一下。
这是一个刷卡放水设备。终端有32台设备,每台设备供用户刷卡,然后进行扣费放水。由于当初采购有问题,购买的射频卡有问题,无法实现直接保存用户金额。所以采用了一个不得已的办法,就是即时通讯。具体的工作流程是这样的:
当用户刷卡时,下位机向上位机发送一个查询指令,上位机收到查询指令,根据卡号到数据库中查询该卡余额,并把结果发送给下位机设备(通过设备号进 行匹配)。下位机设备收到指令后,根据结果,如果余额够,就开始放水。放水成功就再发送一个指令给上位机。上位机收到指令后在数据库中进行扣费操作,本次 通讯过程结束。
现在这些功能都能实现,因为我之前也没搞过485通讯,我想到的不确定因素在于:如果终端有多个用户同时刷卡,我的上位机因为是一对多,所以我不 知道程序会如何反应?是有排队机制呢?还是会丢弃一些数据?或者会不会多个设备同时发送数据过来,上位机收到的数据错位了?请各位大牛不吝指教!!!没有 别的,分数多多奉上!
我的处理机制是这样的:在DataReceived事件中使用了windows消息机制,一旦收到数据,就拼接一下,然后发出消息给对应窗口。为 了功能的实现,我在主窗口中实现了窗口一打开就打开串口,然后接收下位机的指令。部分核心代码如下,请大家帮忙分析分析有没有问题:
sp.Open();
sp.DataReceived += new SerialDataReceivedEventHandler(sp_DataReceived);
string val;
int len;
private void sp_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
SerialPort port = (SerialPort)sender;
len = port.BytesToRead;
if (len > RecieveBuf.Length)
{
len = RecieveBuf.Length;
}
port.Read(RecieveBuf, 0, len);
val = "";
for (int i = 0; i < RecieveBuf.Length; i++)
{
val += RecieveBuf[i] + ",";
}
if (val.Length > 0)<
采用485通信协议,C#端采用SerialPort类实现数据收发C#与多设备通过485通讯的问题
最新推荐文章于 2024-09-05 10:16:28 发布