int bytes = serialPort1.BytesToRead; 我在后面定义一个数组: byte[] buffer = new byte[bytes];当串口缓存里有16个数据时,bytes却只有3,有时是13,有时8,反正经常只读了一部分数据,导致该数组里的数据总是一经判断就出错。为什么呀?为何bytes和serialPort1.BytesToRead不相等,怎么解决这个问题,希望大家帮帮我!
调试欢乐多
例如:
if (!serialPort1.IsOpen)
{
serialPort1.Open();
}
byte[] temp1 = mysendb("FF FF 00 00 FF FF"); //复位指令
serialPort1.Write(temp1, 0, 6);//发送复位数据
Thread.Sleep(1000);
byte[] recb = new byte[6];//接收复位返回值
int iffuwei = serialPort1.Read(recb, 0, 6);
if (AVR.BytesToRead > 0)
{
byte[] tmpbuf = new byte[AVR.BytesToRead];
AVR.Read(tmpbuf, 0, AVR.BytesToRead);
ls_RevceDate = BitConverter.ToString(tmpbuf).Trim();
}
{
serialPort1.Read(buffer, 0, bytes);
if (buffer[bytes - 2] == 255 & buffer[bytes - 1] == 255)
break;
}这个循环读取 有问题吗
public partial class Form1 : Form
{
delegate void del();
public Form1()
{
InitializeComponent();
} private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
this.Invoke(new del(A));
}
private void A()
{
if (serialPort1.BytesToRead == 9)
{
byte[] buffer = new byte[serialPort1.BytesToRead];
serialPort1.Read(buffer, 0, serialPort1.BytesToRead);
string str=Encoding.ASCII.GetString(buffer);
richTextBox1.AppendText(str);
}
} private void Form1_Load(object sender, EventArgs e)
{
serialPort1.Open();
} private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
if (serialPort1.IsOpen)
{
serialPort1.Close();
}
}
}不知你具体的需求是什么,反正我能顺利将数据按9个字节读进来为。
byte[] buffer = new byte[bytes];
for (;;)
{ serialPort1.Read(buffer, 0, bytes);
if (buffer[bytes - 2] == 255 & buffer[bytes - 1] == 255)
break;
}因为出现了只读取了一部分数据的情况,我加了for语句是想反复读数据,判断所读取的数据最后两个是255的时候,就认为已经完整读取了一组数据,跳出循环,往下执行。
感觉程序有问题,希望大家指点一下。
里的&应该改为&&.
假如你的每组数据长度不固定,只是以255 作为结束标志,我觉得要另建一数组,每次读取一字节进去,遇到255时表示读完,取出这数组的值,然后清空,重新再填。
while (true)
{
if (serialPort1.BytesToRead > 0)
{
arr.Add((byte)serialPort1.ReadByte());
if (arr.Count > 2)
{
int len = arr.Count;
if (arr[len - 1] == 255 && arr[len - 2] == 255)
{
break;
}
}
}
}
/*
* 处理arr */
arr.Clear();
不然肯定会接收不完整了
List<byte> arr = new List<byte>();放在外事件处理函数外面
我把数据读到list中后,再把list中的数据放到数组buffer里,把list清空,后面显示buffer里的数据
发到400多组的时候,又开始整组丢数据了。代码如下: List<byte> arr = new List<byte>();
while (true)
{
if (serialPort1.BytesToRead > 0)
{
System.Threading.Thread.Sleep(10);
arr.Add((byte)serialPort1.ReadByte());
if (arr.Count > 2)
{
int len = arr.Count;
if (arr[len - 1] == 255 && arr[len - 2] == 255)
{
break;
}
}
}
}
int bytes = arr.Count;
byte[] buffer = new byte[bytes]; for (int i = 0; i < bytes; i++)
{
buffer[i] = arr[i]; }
arr.Clear();
我觉得你直接判断报文结束字符不就行了