采用485通信协议,C#端采用SerialPort类实现数据收发C#与多设备通过485通讯的问题

最近做一个项目,下位机是单片机,上位机程序采用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)<

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值