C# 无法与obd II通信
我正在尝试与ECUsim 2000通信,它是OBD ll ECU模拟器()。然而,我总是从设备上收到类似于“?”或“?”(当我运行TouchScan或OBD Auto Doctor等程序时,它们会成功读取数据,以便设备正常工作)。我正在用C#via发送comand 我在SerialPort的DataReceived事件中接收信号C# 无法与obd II通信,c#,serial-port,obd-ii,C#,Serial Port,Obd Ii,我正在尝试与ECUsim 2000通信,它是OBD ll ECU模拟器()。然而,我总是从设备上收到类似于“?”或“?”(当我运行TouchScan或OBD Auto Doctor等程序时,它们会成功读取数据,以便设备正常工作)。我正在用C#via发送comand 我在SerialPort的DataReceived事件中接收信号 message = "Data Received: " + serialPort1.ReadExisting(); this.Invoke(new EventHan
message = "Data Received: " + serialPort1.ReadExisting();
this.Invoke(new EventHandler(displayText));
我现在不知道我错过了什么。这是完整的源代码
private void Form1_Load(object sender, EventArgs e)
{
serialPort1.PortName = "COM3";
serialPort1.BaudRate = 115200;
serialPort1.Parity = System.IO.Ports.Parity.None;
serialPort1.StopBits = System.IO.Ports.StopBits.One;
serialPort1.DataBits = 8;
serialPort1.Handshake = System.IO.Ports.Handshake.None;
serialPort1.Open();
}
private void button1_Click(object sender, EventArgs e)
{
if (serialPort1.IsOpen)
{
serialPort1.Write("010D\r");
}
}
private void displayText(object sender, EventArgs e)
{
textBox1.AppendText(message + "\n");
}
private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
message = "Data Received: " + serialPort1.ReadExisting();
this.Invoke(new EventHandler(displayText));
}
ECUsim 2000的默认通信设置为
波特率:115200
数据位:8
平价:无
停止位:1
协议为ISO 15765-4,设备上有两个开关,分别为协议属性CAN ID 29/11位和CAN波特率500 kbps/250kbps。也许,问题与这些相关,因此没有适当的通信设置
另一个问题->有没有办法在串行通信中设置协议(如ISO 15765-4?有两个问题与给出的代码有关 1) ECUsim 2000上有两个接头。其中一个是B型USB端口,另一个是诊断链路连接器(DLC)。若要通过B型USB端口连接到设备,波特率为:115200。如果使用数据链路连接器,波特率很可能是9600或38400。这里,连接是通过故障诊断仪进行的,因此(对我来说)波特率38400适合我 2) 如注释中所述,为了获取数据,必须使用SerialPort的
Read()
方法。它可以用作以下代码:
int buffSize = 1024;
bool cont = true;
int count = 0;
byte[] bff = new byte[buffSize];
string returnVal = string.Empty;
count = serialPort1.Read(bff, 0, buffSize);
returnVal += System.Text.Encoding.Default.GetString(bff, 0, count);
这个字符由Encoding.ASCII生成。ASCII试图将无意义的字符转换回真实的ASCII字符,并放弃希望,因为数据包含大于127的值。没有串行端口设备使用其产品号作为波特率。对不起,我编辑了代码上显示的波特率。我认为错误是由于解释接收到的数据CAN不使用ASCII,它不是文本协议。因此,不要使用返回字符串的SerialPort方法,而是使用Read()。
int buffSize = 1024;
bool cont = true;
int count = 0;
byte[] bff = new byte[buffSize];
string returnVal = string.Empty;
count = serialPort1.Read(bff, 0, buffSize);
returnVal += System.Text.Encoding.Default.GetString(bff, 0, count);