同时发送和接收数据“串口问题” [英] Send and receive data in the same time "serial port problem"

查看:61
本文介绍了同时发送和接收数据“串口问题”的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在C#上做了一个应用程序,同时在中发送和接收数据,应用程序 2008 智能设备应用程序上构建代码关键字> 

我必须与外部组件通信。所以我通过 PDA将数据发送到此组件,组件在收到后发送数据我的pda发送的数据。

问题 我的应用程序' t接收此组件发送的所有数据。有一些错过的数据。

我应该收到这个数据6 6 2 83 71 0 1 3 209 41,但我收到2 63 71 0 63 209 41

plaese help。谢谢微笑| :)





这是我的代码



< pre lang =c#> private void button2_Click( object sender,EventArgs e)
{


// 第一个数据
Thread.Sleep( 70 );
serialPort1.Write( new byte [] { 65 }, 0 1 );
Thread.Sleep( 70 );
serialPort1.Write( new byte [] { 18 }, 0 1 );
Thread.Sleep( 70 );


// 这里我应该从接收器获取nubmer 6


serialPort1.Parity = Parity.Odd; /// /////

// 第二个数据

serialPort1.Write( new byte [] { 2 }, 0 1 );
Thread.Sleep( 70 );
serialPort1.Write( new byte [] { 91 }, 0 1 );
Thread.Sleep( 70 );
serialPort1.Write( new byte [] { 69 }, 0 1 );
Thread.Sleep( 70 );
serialPort1.Write( new byte [] { 3 }, 0 1 );
Thread.Sleep( 70 );
serialPort1.Write( new byte [] { 3 }, 0 1 );
Thread.Sleep( 70 );
serialPort1.Write( new byte [] { 66 }, 0 1 );
Thread.Sleep( 70 );


// 这里我应该从收件人那里得到6




// 第三个数据

serialPort1.Write( new byte [] { 65 }, 0 1 );
Thread.Sleep( 70 );
serialPort1.Write( new byte [] { 17 }, 0 1 );
Thread.Sleep( 70 );

// 这里我应该得到2 83 71 0 1 3 209 41

// 最后数据

serialPort1。写( new byte [] { 6 }, 0 1 );
// serialPort1.Parity = Parity.None; ////////
}



private void serialPort1_DataReceived( object sender,SerialDataReceivedEventArgs e)
{
while (serialPort1.BytesToRead> 5)
{
data = serialPort1.ReadExisting();

char [] charValues = data.ToCharArray();

foreach char _eachChar in charValues)
{
value =(_eachChar);
data2 + = String .Format( {0:X} value + );

}

.Invoke( new EventHandler(display_data_event)); // fonctiontempsréel
data2 = ;
}
}

私有 void display_data_event( object sender,EventArgs e)
{
textBox2.Text = data;
textBox4.Text = data2;
}





我的尝试:



private void button2_Click(object sender,EventArgs e)

{





/ / first data

Thread.Sleep(70);

serialPort1.Write(new byte [] {65},0,1);

Thread.Sleep(70);

serialPort1.Write(new byte [] {18},0,1);

Thread.Sleep(70);





//这里我应该从接收器获得nubmer 6





serialPort1.Parity = Parity.Odd; ////////



//第二个数据



serialPort1.Write(新字节[] {2},0,1);

Thread.Sleep(70);

serialPort1.Write(new byte [] {91},0,1) ;

Thread.Sleep(70);

serialPort1.Write(new byte [] {69},0,1);

Thread .Sleep(70);

serialPort1.Write(new byte [] {3},0,1);

Thread.Sleep(70);

serialPort1.Write(new byte [] {3},0,1);

Thread.Sleep(70);

serialPort1.Write(new byte [] {66},0,1);

Thread.Sleep(70);





//在这里我应该从收音机里拿到6个









//第三个数据



serialPort1.Write(new byte [] {65},0,1);

Thread.Sleep(70 );

serialPort1.Write(new byte [] {17},0,1);

Thread.Sleep(70);



//这里我应该得到2 83 71 0 1 3 209 41



//最后数据



serialPort1.Write(new byte [] {6},0,1);

//serialPort1.Parity = Parity.None; ////////

}







私人void serialPort1_DataReceived(object sender,SerialDataReceivedEventArgs e)

{

while(serialPort1.BytesToRead> 5)

{

data = serialPort1.ReadExisting();



char [] charValues = data.ToCharArray();



foreach(CharValues中的char _eachChar)

{

value =(_eachChar);

data2 + = String.Format({ 0:X},值+);



}



this.Invoke(new EventHandler(display_data_event)); // fonctiontempsréel

data2 =;

}

}



private void display_data_event(object sender,EventArgs e)

{

textBox2.Text = data;

textBox4 .Text = data2;

}

解决方案

问题很可能是你不一定收到所有的数据事件 - S. erial端口是slooooow,数据是逐字节到达的:因此DataReceived事件将为从PDA设备收到的每条消息多次触发。它很可能会为每个角色射击!

当你累积五个字节时,你会显示它们,并覆盖以前的内容,扔掉它。



我首先将所有数据(可能是原始字节放入日志文件)并将其添加到我的文本框而不是覆盖内容 - 特别是因为您显示的数据不匹配您提供的代码:它不是十六进制数据!


您是否尝试使用我在第一个问题中建议的终端模拟器?



要调试串行链接,首先要做的是证明链接的另一半按预期工作。您收到的证明链接参数和数据。

一旦完成,您就会知道问题在您身边。

如果您不这样做,您就处于黑暗中尝试随机的东西。


Hi, i did an application on C# that send and receive data in the same time, the application is built with C# on visula studio 2008 smart device application.

i have to communicate with an external component. so i send data via a "PDA to this component" , and the componenet send me data after it receive data sent by my pda.

the problem is that my application can't receive all the data sent by this component. there is some missed data.

i shoud receive this data "6 6 2 83 71 0 1 3 209 41" but me i receive "2 63 71 0 63 209 41"

plaese help. thanks Smile | :) 



here is my code

private void button2_Click(object sender, EventArgs e)
{


//first data
Thread.Sleep(70);
serialPort1.Write(new byte[] { 65 }, 0, 1);
Thread.Sleep(70);
serialPort1.Write(new byte[] { 18 }, 0, 1);
Thread.Sleep(70);


// here i should get the nubmer 6 from the receiver


serialPort1.Parity = Parity.Odd; ////////

// second data

serialPort1.Write(new byte[] { 2 }, 0, 1);
Thread.Sleep(70);
serialPort1.Write(new byte[] { 91 }, 0, 1);
Thread.Sleep(70);
serialPort1.Write(new byte[] { 69 }, 0, 1);
Thread.Sleep(70);
serialPort1.Write(new byte[] { 3 }, 0, 1);
Thread.Sleep(70);
serialPort1.Write(new byte[] { 3 }, 0, 1);
Thread.Sleep(70);
serialPort1.Write(new byte[] { 66 }, 0, 1);
Thread.Sleep(70);


// here i should get 6 from the receier




//third data

serialPort1.Write(new byte[] { 65 }, 0, 1);
Thread.Sleep(70);
serialPort1.Write(new byte[] { 17 }, 0, 1);
Thread.Sleep(70);

// here i should get 2 83 71 0 1 3 209 41

// last data

serialPort1.Write(new byte[] { 6 }, 0, 1);
//serialPort1.Parity = Parity.None; ////////
} 



private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
while (serialPort1.BytesToRead >5)
{
data = serialPort1.ReadExisting();

char[] charValues = data.ToCharArray();

foreach (char _eachChar in charValues)
{
value = (_eachChar);
data2 += String.Format("{0:X}", value + " ");

}

this.Invoke(new EventHandler(display_data_event));// fonction temps réel
data2 = "";
}
}

private void display_data_event(object sender, EventArgs e)
{
textBox2.Text = data;
textBox4.Text = data2;
}



What I have tried:

private void button2_Click(object sender, EventArgs e)
{


//first data
Thread.Sleep(70);
serialPort1.Write(new byte[] { 65 }, 0, 1);
Thread.Sleep(70);
serialPort1.Write(new byte[] { 18 }, 0, 1);
Thread.Sleep(70);


// here i should get the nubmer 6 from the receiver


serialPort1.Parity = Parity.Odd; ////////

// second data

serialPort1.Write(new byte[] { 2 }, 0, 1);
Thread.Sleep(70);
serialPort1.Write(new byte[] { 91 }, 0, 1);
Thread.Sleep(70);
serialPort1.Write(new byte[] { 69 }, 0, 1);
Thread.Sleep(70);
serialPort1.Write(new byte[] { 3 }, 0, 1);
Thread.Sleep(70);
serialPort1.Write(new byte[] { 3 }, 0, 1);
Thread.Sleep(70);
serialPort1.Write(new byte[] { 66 }, 0, 1);
Thread.Sleep(70);


// here i should get 6 from the receier




//third data

serialPort1.Write(new byte[] { 65 }, 0, 1);
Thread.Sleep(70);
serialPort1.Write(new byte[] { 17 }, 0, 1);
Thread.Sleep(70);

// here i should get 2 83 71 0 1 3 209 41

// last data

serialPort1.Write(new byte[] { 6 }, 0, 1);
//serialPort1.Parity = Parity.None; ////////
}



private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
while (serialPort1.BytesToRead >5)
{
data = serialPort1.ReadExisting();

char[] charValues = data.ToCharArray();

foreach (char _eachChar in charValues)
{
value = (_eachChar);
data2 += String.Format("{0:X}", value + " ");

}

this.Invoke(new EventHandler(display_data_event));// fonction temps réel
data2 = "";
}
}

private void display_data_event(object sender, EventArgs e)
{
textBox2.Text = data;
textBox4.Text = data2;
}

解决方案

The problem is quite likely to be that you don't necessarily receive all the data in one event - Serial ports are slooooow, and data arrives byte-by-byte: so the DataReceived event will fire multiple times for each "message" received from your PDA device. It's quite possible that it will fire for each individual character!
And when you do accumulate five bytes, you display them, and overwrite the previous content, throwing it away.

I'd start by accumulating all the data (probably as raw bytes into a log file) and adding it to my text box instead of overwriting the content - particularly as the data you show doesn't match the code you give: it isn't hex data!


Did you try to use a terminal emulator as I suggested in first question ?

To debug a serial link, the first thing to do is to proof that the other half of the link works as expected. Proof link parameters and data you receive.
Once it is done, you know problems are on your side.
If you don't do it, you are in the dark trying random things.


这篇关于同时发送和接收数据“串口问题”的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆