111,093
社区成员




private void sp_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
System.Threading.Thread.Sleep(9000);//延时9000ms等待接收完数据
//this.Invoke就是跨线程访问ui的方法,也是本文的范例
BeginInvoke(new EventHandler(delegate
{
Byte[] ReceivedData = new byte[sp.BytesToRead]; //创建接收字节数组
sp.Read(ReceivedData, 0, ReceivedData.Length); //读取所接收到的数据
string RecvDataText = null;
if (false == isHex)
{
for (int i = 0; i < ReceivedData.Length; i++)
{
RecvDataText += ReceivedData[i];
}
//byte类型转成string类型
RecvDataText = System.Text.Encoding.Default.GetString(ReceivedData);
tbxRecvData.Text += RecvDataText;//更新接收框数据
tbxRecvLength.Text = tbxRecvData.TextLength.ToString();//更新接收框
}
else
{
for (int i = 0; i < ReceivedData.Length; i++)
{
//byte转image部分程序
RecvDataText += (ReceivedData[i].ToString("X2") + " ");
barCodeImg.Image = OvImage;
tbxRecvData.Text += RecvDataText;//更新接收框数据
tbxRecvLength.Text = (tbxRecvData.TextLength / 3).ToString();//更新接收框数据长度
}
sp.DiscardInBuffer(); //丢弃接收缓冲区数据
}));
}
//Init variables
string s = ""; //info
List<byte> ResultData = new List<byte>(); //save received message
//Read multiple times until meet empty gap
while (port1.BytesToRead>0)
{
byte[] buffer = new byte[port1.BytesToRead]; //define a buffer
port1.Read(buffer, 0, port1.BytesToRead); //read data to buffer
ResultData.AddRange(buffer); //Add buffer to result
//Auto break when size too long
if (ResultData.Count>1024)
{
break;
}
Thread.Sleep(20); //Wait to see if more data is on the way
//limitimer gap is about 15-18 ms, to receive all , use 20 ms, is the safest way.
}
//Get final result
byte[] data = ResultData.ToArray();
void serialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
//接收数据
string str = "";
do
{
int count = serialPort.BytesToRead;
if (count <= 0)
break;
byte[] readBuffer = new byte[count];
Application.DoEvents();
serialPort.Read(readBuffer, 0, count);
str += System.Text.Encoding.Default.GetString(readBuffer);
} while (serialPort.BytesToRead > 0);
listBox1.Items.Add(str);
}
网上看的一段代码用来保证数据接收完成,不要用Thread.Sleep();