博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C# serialPort的DataReceived事件无法触发 ,用的霍尼韦尔的扫码枪并且装了相应的USB转串口驱动。...
阅读量:5058 次
发布时间:2019-06-12

本文共 2231 字,大约阅读时间需要 7 分钟。

昨天想试试霍尼韦尔的扫码枪,扫码枪有两种模式,键盘模式和串口模式,

1、键盘模式直接插上就行了,就像一个键盘一样不需要任何驱动,扫出来的数据直接落到PC的输入焦点上。就像一个键盘一样,只能输入字符。

2、而串口模式,则是安装驱动以后,能够虚拟成一个COM口,

如果我们用扫码枪给应用程序输入数据的时候肯定是不行的,因为程序需要能够在后台运行的时候也能用扫码枪作为数据输入的。这就需要用串口模式了。

今天我写程序的时候,问题是怎么也不能触发,DataReceived事件,最后发现问题所在,几个要点

1、串口必须New新实例,必须和能够正确获取硬件串口的名称。

2、sp.ReceivedBytesThreshold = 1; 这个是默认值就是1,就是有一个字节的数据就触发事件。

3、sp.RtsEnable = true;sp.DtrEnable = true;这两个属性必须得正确设置,哈

我就是因为第3个原因一直不不能正确触发事件。记得添加事件绑定代码啊。

 

public partial class Form1 : Form

{
SerialPort sp;
bool bIsReading = false;
// Dynamic d = new Dynamic();

public Form1()

{
InitializeComponent();
}

private void button1_Click(object sender, EventArgs e)

{
bool b = false;
try
{
sp = new SerialPort();
sp.BaudRate = 115200;
sp.DataBits = 8;
sp.Parity = Parity.None;
sp.StopBits = StopBits.One;
sp.PortName = System.IO.Ports.SerialPort.GetPortNames()[0];
sp.RtsEnable = true;
sp.DtrEnable = true;
sp.ReadTimeout = 3000;
sp.ReceivedBytesThreshold = 1;
sp.DataReceived += new System.IO.Ports.SerialDataReceivedEventHandler(this.sp_DataReceived_1);
// sp.DataReceived += Sp_DataReceived;
// sp.DataReceived -= Sp_DataReceived;
sp.Open();
}
catch (Exception xe)
{
b = true;
MessageBox.Show("异常:" + xe.Message);

}

finally {
if (sp != null && b == true)
{
if (sp.IsOpen)
{
sp.Close();

} else

{
sp = null;
}
}

b = false;

}

}

 

private void Form1_FormClosing(object sender, FormClosingEventArgs e)

{

//sp.DiscardInBuffer();

if (sp != null)
{
sp.Close();
sp.Dispose();
}
}

private void sp_DataReceived_1(object sender, SerialDataReceivedEventArgs e)

{

if (bIsReading == true)
return;
bIsReading = true;
try
{
StringBuilder currentline = new StringBuilder();
//循环接收数据
while (sp.BytesToRead > 0)
{
char ch = (char)sp.ReadByte();
currentline.Append(ch);
}
//在这里对接收到的数据进行处理
MessageBox.Show("数据为:" + currentline.ToString());

//GlobalPublic.BasePublic.ShowMessage("数据为:" + currentline.ToString(), (BaseFrm as BaseForm.FrmBaseDoc).MTC_oGlobal);

//InvokeDelegate del = new InvokeDelegate(setItem);
//this.BeginInvoke(del, currentline.ToString());
//setItem(currentline.ToString());
// currentline = new StringBuilder();
}
catch (Exception ex)
{
MessageBox.Show("异常:" + ex.Message);
}
finally
{
bIsReading = false;
}
}
}
}

转载于:https://www.cnblogs.com/ModBus/p/8527509.html

你可能感兴趣的文章
今天收获
查看>>
windows phone 商城规则测试工具
查看>>
GDI对象的初始化
查看>>
OSD实现原理介绍(转)
查看>>
Unrequited Love [ZOJ 3601]
查看>>
sqoop实战一 增量导入hdfs
查看>>
七、Null、空以及0的区别
查看>>
什么是反射、javassist和asm(java动态编程)
查看>>
Dom7.js 源码阅读备份
查看>>
聚类算法:K-means 算法(k均值算法)
查看>>
python 中的 re.compile 函数
查看>>
图片居中 方法
查看>>
file_get_contents
查看>>
设计模式六大原则【单一职责】【里氏替换】【迪米特法则】【依赖倒置原则】【接口隔离原则】【开闭原则】...
查看>>
win环境变量path因第三方软件导致不一致的问题分析
查看>>
Perl取得一个数组长度
查看>>
ArcGIS Engine许可初始化-白旭阳(ESRI )
查看>>
Java多线程系列--“JUC锁”08之 共享锁和ReentrantReadWriteLock
查看>>
数据库事务的四大特性以及事务的隔离级别
查看>>
多线程、异步调用异常场景测试
查看>>