读modbus命令并返回数据奇怪问题,求大声答疑!!!

yinyi4120 2015-03-14 05:54:35
自己编写的一个监测程序,程序读自己设备传过来的数据,并与大监测通信。内部数据采用rs232主发模式,接收没有问题。
与大监测采用modbus rtu方式。大监测发过来的数据能接收,但是我的监测程序刚运行时,能正确的接收modbus命令并返回数据,但是运行一段时间后就无法返回数据。请大神看看呢。
modbus命令采用串口数据触发方式,代码如下

void _serialPort_DataUpSend(object sender, SerialDataReceivedEventArgs e)
{
//禁止接收事件时直接退出
if (ReceiveEventFlag_Power)
{
return;
}
try
{
string readstr = null;
int n = _serialPort.BytesToRead;
byte[] byRecBuff = new byte[n];
_serialPort.Read(byRecBuff, 0, n);
readstr = myconverter.ToString(byRecBuff, 16);
buffer_rece.AddRange(strToToHexByte(readstr));
byte[] CRC_Result = new byte[2];
GetCRC(byRecBuff, ref CRC_Result);
while (buffer_rece.Count >= 8) //此处可以接收数据实时调试下,看看buffer_JZ中的接收数据是否出来完之前有无被覆盖
{
if ((buffer_rece[0] == 0x06) & (buffer_rece[1] == 0x03))
{
if ((CRC_Result[0] == byRecBuff[n - 2]) && (CRC_Result[1] == byRecBuff[n - 1])) //判断奇偶校验码是否正确
{
ReceiveEventFlag_Power=true;
DataReceived(sender, e, byRecBuff);
buffer_rece.RemoveRange(0, 8);
}
}
else
{
ReceiveEventFlag_Power = false;
buffer_rece.RemoveAt(0);
continue;
}
}
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
}

在主程序的事件处理程序如下:

public void Send_Data_DataUpSend(object sender, SerialDataReceivedEventArgs e, byte[] bits) //modbus协议数据上传事件
{

if (((flag_GJ[0] & 0xFF) == 0) && ((flag_GJ[1] & 0xFF) == 0) && ((flag_GJ[2] & 0xFF) == 0) && ((flag_GJ[3] & 0xFF) == 0) && ((flag_GJ[4] & 0xFF) == 0))
{
send_byte[5] = (byte)(send_byte[5] & 0xFE);
}
else
{
send_byte[5] = (byte)(send_byte[5] | 0x01);
}
byte[] dst = new byte[(int)bits[5] * 2];
//发送故障信息
Buffer.BlockCopy(send_byte, (int)bits[3] * 2, dst, 0, (int)bits[5] * 2);
Send_Data.SendData(Send_Data.GetFrame(bits[0], bits[1], (byte)(bits[5] * 2), dst), 0, (int)bits[5] * 2 + 5);
}

谢谢诸位了。。。。。。。
...全文
827 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
於黾 2015-03-17
  • 打赏
  • 举报
回复
你怎么知道串口事件没有触发,断点调试了吗,写日志了吗 串口通信,你接收用的回调函数,它并不保证执行的时候是收到一个完整的数据 所以你收到数据之后要先缓存,拼接,再判断 否则有时好使,有时不好使,就正常了 此外,你要保证串口对象一直存在,比如要定义成全局变量,而不是局部变量,不要被垃圾回收了
yinyi4120 2015-03-15
  • 打赏
  • 举报
回复
人工顶一个!
yinyi4120 2015-03-14
  • 打赏
  • 举报
回复
问题是,串口接收数据事件没有被触发。但是为什么刚开始可以触发,运行一段时间后就无法触发呢? 求大神解答?
yinyi4120 2015-03-14
  • 打赏
  • 举报
回复

public void SendData(byte[] data, int offset, int count)
        {
            //禁止接收事件时直接退出
            if (ReceiveEventFlag)
            {
                return;
            }
            try
            {
                if (_serialPort.IsOpen)
                {
                    _serialPort.Write(data, offset, count);
                    ReceiveEventFlag_Power = false;
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

110,535

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧