Tôi đang sử dụng C# để giao tiếp qua modbus rs485 rs232
đến 2 pha mét trong số các nhật ký khác điện áp nguồn.Giao tiếp Modbus
Tôi phải gửi dữ liệu qua xe buýt để tôi có thể nhận được các bài đọc.
Tôi đã kết nối một dây thông thường và rút ngắn việc gửi và nhận.
Dữ liệu được nhận được và sự kiện này là bắn:
private void port_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
SerialPort sp = (SerialPort)sender;
byte[] buff = new byte[sp.BytesToRead];
//Read the Serial Buffer
sp.Read(buff, 0, buff.Length);
string data= sp.ReadExisting();
foreach (byte b in buff)
{
AddBuffer(b); //Add byte to buffer
}
}
Sau đó, bộ đệm này sẽ được gửi đến chức năng khác đó là một trong này:
private void AddBuffer(byte b)
{
buffer.Add(b);
byte[] msg = buffer.ToArray();
//Make sure that the message integrity is correct
if (this.CheckDataIntegrity(msg))
{
if (DataReceived != null)
{
ModbusEventArgs args = new ModbusEventArgs();
GetValue(msg, args);
DataReceived(this, args);
}
buffer.RemoveRange(0, buffer.Count);
}
}
Tôi nghĩ rằng vấn đề nằm ở dữ liệu kiểm tra tính toàn vẹn:
public bool CheckDataIntegrity(byte[] data)
{
if (data.Length < 6)
return false;
//Perform a basic CRC check:
byte[] CRC = new byte[2];
GetCRC(data, ref CRC);
if (CRC[0] == data[data.Length - 2] && CRC[1] == data[data.Length - 1])
return true;
else
return false;
}
Có một kiểm tra CRC và điều lạ lẫm là nó không bao giờ omes đúng. Việc tính toán CRC:
private void GetCRC(byte[] message, ref byte[] CRC)
{
ushort CRCFull = 0xFFFF;
byte CRCHigh = 0xFF, CRCLow = 0xFF;
char CRCLSB;
for (int i = 0; i < (message.Length) - 2; i++)
{
CRCFull = (ushort)(CRCFull^message[i]);
for (int j = 0; j < 8; j++)
{
CRCLSB = (char)(CRCFull & 0x0001);
CRCFull = (ushort)((CRCFull >> 1) & 0x7FFF);
if (CRCLSB == 1)
CRCFull = (ushort)(CRCFull^0xA001);
}
}
CRC[1] = CRCHigh = (byte)((CRCFull >> 8) & 0xFF);
CRC[0] = CRCLow = (byte)(CRCFull & 0xFF);
}
Có tài nguyên trực tuyến nào có bảng điểm của phiên giao tiếp điển hình, hoàn chỉnh với CRC không? Sau đó, bạn ít nhất có thể áp dụng thuật toán của bạn cho các thông điệp mẫu đó và xem liệu bạn có đưa ra cùng một CRC hay không. –
Biến "bộ đệm" là gì? Đây có phải là Danh sách không? Bạn có chắc rằng biến "msg" của bạn lớn hơn 6 không? Tại sao không chỉ sử dụng bộ đệm ra khỏi Cổng nối tiếp thay vì phá vỡ nó trong một vòng lặp bằng byte, xây dựng lại nó trong một Danh sách, sau đó chuyển đổi nó trở lại một mảng byte toàn cầu? Bạn cũng gọi ReadExisting trên Cổng Nối tiếp ngay lập tức sau khi đọc nội dung của bộ đệm, tại sao? –
CRC có vẻ đúng @AndyzSmith. bạn có ý gì khi gọi điện thoại có sẵn trong thực tế, nơi tôi có thể gọi nó?và có bộ đệm là một danh sách – Combinu