老板给我的第一个硬件就是一个读卡器,
说让我做一下试试,于是从网上查了查就写了出来,相当的简单。
但是后来还有一个地磅的串口通讯,我整整搞了一天。
在窗体类的构造函数中写入
Form.CheckForIllegalCrossThreadCalls = false;
可以在线程外更新窗体,这样就可以一直接收数据,一直更新ui了。
打开串口按钮:
//实例化
SerialPort Myport = new SerialPort();
//设置串口端口
Myport.PortName = cbxPortName.Text;
//设置比特率
Myport.BaudRate = Convert.ToInt32(cmbbaud.Text);
//设置数据位
Myport.DataBits = Convert.ToInt32(cmbBits.Text);
//根据选择的数据,设置停止位
//if (cmbStop.SelectedIndex == 0)
// Myport.StopBits = StopBits.None;
if (cmbStop.SelectedIndex == )
Myport.StopBits = StopBits.One;
if (cmbStop.SelectedIndex == )
Myport.StopBits = StopBits.OnePointFive;
if (cmbStop.SelectedIndex == )
Myport.StopBits = StopBits.Two; //根据选择的数据,设置奇偶校验位
if (cmbParity.SelectedIndex == )
Myport.Parity = Parity.Even;
if (cmbParity.SelectedIndex == )
Myport.Parity = Parity.Mark;
if (cmbParity.SelectedIndex == )
Myport.Parity = Parity.None;
if (cmbParity.SelectedIndex == )
Myport.Parity = Parity.Odd;
if (cmbParity.SelectedIndex == )
Myport.Parity = Parity.Space; //此委托应该是异步获取数据的触发事件,即是:当有串口有数据传过来时触发
Myport.DataReceived += new SerialDataReceivedEventHandler(port1_DataReceived);//DataReceived事件委托
//打开串口的方法
try
{
Myport.Open();
if (Myport.IsOpen)
{
MessageBox.Show("串口已打开");
}
else
{
MessageBox.Show("串口未能打开");
}
}
catch (Exception ex)
{
MessageBox.Show("串口未能打开"+ex.ToString());
}
关闭就使用 Myport.Close(); 在读卡器的串口通讯中是不会有问题的
DataReceived事件委托的方法
private void port1_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
try
{
string currentline = "";
//循环接收串口中的数据
while (Myport.BytesToRead > )
{
char ch = (char)Myport.ReadByte();
currentline += ch.ToString();
}
//在这里对接收到的数据进行显示
//如果不在窗体加载的事件里写上:Form.CheckForIllegalCrossThreadCalls = false; 就会报错)
this.txtReceive.Text = currentline;
}
catch (Exception ex)
{
Console.WriteLine(ex.Message.ToString());
}
}