不知道为什么,我和单片机做通信,发送01 03 00 00 00 04 44 09 正确回复应该是01 03 08 XX XX XX XX XX XX XX XX XX XX
但是只回复了01 03 08 XX XX XX XX XX,丢失了几个字节,而缓冲区的length做断点的时候不能超过8。。。有点郁闷,我的接收缓冲区最大是2048的。新手 求解答,谢谢!
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO.Ports;
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
int length,count; //缓冲区数据的字节数
byte[] rebuff=new byte[15];
byte[] returndata = new byte[2];
string data;
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
int a;
for (a = 1; a < 11; a++)
{
comboBox1.Items.Add("COM"+a.ToString());
}
comboBox1.Text = "COM1";
}
private void button2_Click(object sender, EventArgs e)
{
try
{
serialPort1.PortName = comboBox1.Text; //串口
serialPort1.DataBits = 8; //数据位
serialPort1.StopBits = StopBits.One; //停止位
serialPort1.BaudRate = 9600; //波特率
serialPort1.Parity = Parity.Even; //偶校验
serialPort1.Open(); //打开串口
timer1.Start(); //启动定时器
ovalShape1.FillColor = Color.Red;
}
catch
{
ovalShape1.FillColor = Color.White;
MessageBox.Show("端口错误", "error");
serialPort1.Close();
}
}
public void senddata() //发送数据
{
try
{
byte[] buff = new byte[13];
buff[0] = 0x01;
buff[1] = 0x03;
buff[2] = 0x00;
buff[3] = 0x00;
buff[4] = 0x00;
buff[5] = 0x01;
crc16(buff,6);
buff[6] = returndata[0];
buff[7] = returndata[1];
serialPort1.Write(buff, 0, 8);
System.Threading.Thread.Sleep(100);
}
catch
{
MessageBox.Show("数据写入错误","error");
}
}
private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e) //触发事件接收数据
{
System.Threading.Thread.Sleep(300); //延时
length = serialPort1.BytesToRead; //获取缓冲区字节数
serialPort1.Read(rebuff, 0, length); //读数据
this.Invoke(new EventHandler(display));
}
private void display(object sender, EventArgs e)
{
int i;
string str;
string[] data = new string[length];
for (i = 0; i < length; i++)
{
data[i] = Convert.ToString(rebuff[i], 16).ToUpper(); //显示十六进制大写数据
str = data[i];
if (str.Length == 1)
{
str = "0" + str;
}
textBox2.AppendText(str);
}
}
private void button3_Click(object sender, EventArgs e) //清除数据
{
try
{
textBox2.Text = "";
}
catch
{
MessageBox.Show("清除接收区数据错误", "error");
}
}
public byte[] crc16(byte[] data,int Length) //CRC16校验
{
byte i,j;
int crc16=0xFFFF;
for(i=0;i<Length;i++)
{
crc16^=data[i];
for(j = 0; j < 8; j++)
{
if((crc16&0x01)==1)
{
crc16=(crc16>>1)^0xA001;
}
else
crc16=crc16>>1;
}
}
returndata = new byte[2] { (byte)(crc16 & 0xFF), (byte)(crc16 >> 8) };
return returndata;
}
private void button4_Click(object sender, EventArgs e) //关闭串口
{
ovalShape1.FillColor = Color.White;
serialPort1.Close();
timer1.Stop();
}
private void timer1_Tick(object sender, EventArgs e) //定时器
{
count++;
if (count == 10)
{
senddata();
count = 0;
}
}
}
}