之前发的那个帖子是从网上转的,这回亲自写个程序发现了好多问题啊,郁闷
SerialPort serialPort1 = new SerialPort();
serialPort1.PortName = "COM3";
serialPort1.BaudRate = 2400;
serialPort1.StopBits = StopBits.One;//获取或设置每个字节的标准停止位数
serialPort1.Parity = 0;//获取或设置奇偶校验检查协议
serialPort1.Open();
1 串口收程序发的数据
serialPort1.WriteLine(textBox1.Text);
在按钮里写上 这句话就好使了,串口能很好的收到程序发的数据
2 程序收串口发的程序//这个跟之前发的帖子里不一样
之前帖子里用的是serialPort1.ReadLine();这句话 会使程序一直在读取串口,我不太会使;
改为用serialPort1.Read();//这个方法要配上线程使用
--------------------------------------------------------------------
public delegate void CANHandler(string param);//建了个委托
private static CANHandler onCAN;//委托
public event CANHandler GetCAN//一个事件
{
add { onCAN += new CANHandler(value); }
remove { onCAN -= new CANHandler(value); }
}
public SerialPort serialPort1;
public Thread thread1;
public byte[] ds;
StringBuilder sb;
public Form1()
{
InitializeComponent();
//----------------------------------------------------------------串口
serialPort1 = new SerialPort();
serialPort1.PortName = "COM3";
serialPort1.BaudRate = 2400;
serialPort1.Open();
serialPort1.StopBits = StopBits.One;
serialPort1.Parity = 0;
ds = new byte[1024];
sb = new StringBuilder();
//----------------------------------------------------------------线程
thread1 = new Thread(new ThreadStart(CS));
thread1.Start();
this.GetCAN += this.OnCANRead;
}
private void CS()//线程方法
{
int l = 0, i = 0;
while (1 == 1)
{
i = 0;
Thread.Sleep(1000);
l = serialPort1.BytesToRead;//获取 串口中发了几位数据
if (l > 0)//去掉 StringBuilder 中上次获取的值------既while一次是线程的一次读取
{
sb.Remove(0, sb.Length);
}
while (i < l)//循环去读取 串口中的数据 因为每次读取的只是串口发来数据的第一位
{
int len = serialPort1.Read(ds, 0, 1024);
sb.Append(Encoding.ASCII.GetString(ds, 0, len));//StringBuilder 把数组拼成字符串
i += len;
}
onCAN(sb.ToString());
}
}
private void OnCANRead(string param)//上面写的线程会不断给这个方法传值,所以操作写在这里
{
th_evn = param;
object[] pList = { this, System.EventArgs.Empty };
//textBox1.BeginInvoke(new System.EventHandler(UpdateUI), pList);//这两行是还切换线程的,这样就可以给当前线程的控件传值了
label1.BeginInvoke(new System.EventHandler(UpdateUI), pList);//这两行是还切换线程的,这样就可以给当前线程的控件传值了
}
//切换线程
private void UpdateUI(object o, System.EventArgs e)
{
label1.Text = th_evn;
}