C# 无法与obd II通信

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

我正在尝试与ECUsim 2000通信,它是OBD ll ECU模拟器()。然而,我总是从设备上收到类似于“?”或“?”(当我运行TouchScan或OBD Auto Doctor等程序时,它们会成功读取数据,以便设备正常工作)。我正在用C#via发送comand

我在SerialPort的DataReceived事件中接收信号

 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);