首先获取电脑的串口列表:
在窗体上添加一个comboBox控件。
然后使用comboBox1.Items.AddRange(System.IO.Ports.SerialPort.GetPortNames()); 或者
string[] portList = System.IO.Ports.SerialPort.GetPortNames();
foreach (string name in portList) //用习惯了foreach就不太想用for了
{
comboBox1.Items.Add(name);
}
本人习惯将portname写入配置文件,方便更改使用的串口。如serialPort_code.PortName=”COM1”,此时就表示条码枪使用串口1,初始化将所有的PortName都置为COM0,如果是COM0就表示不使用此串口,具体代码如下:
string portname="读配置文件中的串口名";
serialPort_code.PortName=portname;
if (serialPort_code.PortName != "COM0")
{
serialPort_code.Open();
serialPort_code.BaudRate=9600;
}
下面就该添加串口的接收事件了:如果直接在serialPort_code_DataReceived中更改UI,则会报错(从 SerialPort 对象接收数据时,将在辅助线程上引发 DataReceived 事件。由于此事件在辅助线程而非主线程上引发,因此尝试修改主线程中的一些元素(如 UI 元素)时会引发线程异常)。此时的解决办法就是使用委托,使用 Invoke 回发更改请求。
private void serialPort_code_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
//serialPort_code.ReadLine();//串口实际来的数据中不包含\r\n所以就会让ReadLine一直卡住等,直到收到\r\n。所以最好不要用此方法
int n = serialPort_code.BytesToRead;
byte[] buf = new byte[n];
serialPort_code.Read(buf, 0, n);
string station = "procode:";
//条码枪设置有关,读取30位条码,有些条码枪刚好30位,有些是30多位,故设置长度小于35位
if (n < 35)
{
station = station + System.Text.Encoding.ASCII.GetString(buf);
this.Invoke(new UpdataUI(UpdateUI), station);//在拥有此控件的基础窗口句柄的线程上执行委托Invoke(Delegate)
}
else
serialPort_code.DiscardInBuffer();//清空缓存
}
delegate void UpdataUI(string value);/*匿名方法,C#2.0的新功能,这是一种允许程序员将一段完整代码区块当成参数传递的程序代码编写技术,通过此种方法可以直接使用委托来设计事件响应程序以下就是你要在主线程上实现的功能但是有一点要注意,这里不适宜处理过多的方法,因为C#消息机制是消息流水线响应机制,如果这里在主线程上处理语句的时间过长会导致主UI线程阻塞,停止响应或响应不顺畅,这时你的主form界面会延迟或卡死*/
private void UpdateUI(string value)
{
TextBox1.Text=value;
}
string str=”需要发送的数据”;
serialPort_code.WriteLine(str);或者采用下面的方法
byte[] arrsend = new byte[8];
serialPort_tempar.Write(arrsend, 0, 8);