运行后再richtextbox1中只显示一个数,例如:33
随后会报错:对象未引用到对象的实例,点了关闭后又会出现一个数据,例如31,之后又会报错,如此循环,而且数据不太对。
整了好久了,希望能帮帮忙,第一次做这,谢谢!!
代码:
namespace yfy_串口调试
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
/****************************设置变量******************************/
public string[] strArray;
public SerialPort sp1 = new SerialPort();
public Byte[] mydata;
public int mydatalength; //这个数的值是由接收到的字节长度决定的,并且作为mydata的长度,如果索引值还超过数组定义值,就应该是接收问题。
public int zhengfu = 2, now_x = 30;
public static Bitmap bmp = new Bitmap(500,350);
public Graphics gph = Graphics.FromImage(bmp);
public char name_image='A';
/*****************************相关函数****************************/
public void sp1_DataReceived(object sender, SerialDataReceivedEventArgs e)//数据接收函数
{
if (sp1.IsOpen==true ) //为了严谨性,加上检查串口是否被打开
{
if (rbRcv16.Checked == true) //接收16进制按钮
{
try
{
int average_speed = 0; //设置初始平均速度
Byte[] receivedData = new Byte[sp1.BytesToRead]; //创建接收字节数组
sp1.Read(receivedData, 0, receivedData.Length); //读取数据
sp1.DiscardInBuffer(); //清空SerialPort控件的Buffer
mydatalength = receivedData.Length;
for (int i = 0; i < receivedData.Length; i++) //窗体显示
{
richTextBox1.Text = receivedData[i].ToString("X2"); //16进制显示在接受栏
mydata[i] = receivedData[i];
richTextBox1.Text += ","; //让每个数据都隔开
average_speed += receivedData[i];
}
textBox1.Text = (average_speed / receivedData.Length).ToString("X2");
}
catch (System.Exception ex)
{
MessageBox.Show(ex.Message, "出错提示");
}
}
}
else
{
MessageBox.Show("请打开某个串口或者没有选中16进制接收", "错误提示");
}
}
private void Form1_Load(object sender, EventArgs e)//页面初始化
{
Control.CheckForIllegalCrossThreadCalls = false; //强制不检查线程
sp1.DataReceived += new SerialDataReceivedEventHandler(sp1_DataReceived); //订阅委托
sp1.ReceivedBytesThreshold =1; //当缓冲区的字节数为x时,触发datareceive事件
//检查是否有串口
string[] str = SerialPort.GetPortNames();
if (str == null)
{
MessageBox.Show("本机没有串口!", "Error!");
return;
}
//添加串口项目
foreach (string s in System.IO.Ports.SerialPort.GetPortNames())
{
cbSerial.Items.Add(s); //获取有COM口
}
rbRcv16.Checked = true; //接收数据按16进制进行
}
private void btnSwitch_Click(object sender, EventArgs e)//设置串口
{
if (sp1.IsOpen == false)
{
try
{
string serialName = cbSerial.SelectedItem.ToString();//读取串口号
sp1.PortName = serialName; //设置串口号
sp1.BaudRate = 9600; //波特率
sp1.DataBits = 8; //数据位
sp1.StopBits = StopBits.One; //停止位
sp1.Parity = Parity.None; //校验位
sp1.Open(); //打开串口
btnSwitch.Text = "关闭串口";
}
catch (System.Exception ex)
{
MessageBox.Show("Error:" + ex.Message, "Error");
return;
}
}
else
{
sp1.Close(); //关闭串口
btnSwitch.Text = "打开串口";
}
}