C# SetialPort类读取串口数据时使用委托出错。
public void Sp_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
string strTemp = "";
double iSecond = 0.5;
DateTime dtOld = System.DateTime.Now;
DateTime dtNow = System.DateTime.Now;
TimeSpan dtInter;
dtInter = dtNow - dtOld;
int i = Sp.BytesToRead;
if (i > 0)
{
try
{
strTemp = Sp.ReadExisting();
}
catch
{ }
if (strTemp.ToLower().IndexOf("\r") < 0)
{
i = 0;
}
else
{
this.Invoke(interfaceUpdataHandle, strTemp);
}
}
while (dtInter.TotalSeconds < iSecond && i <= 0)
{
dtNow = System.DateTime.Now;
dtInter = dtNow - dtOld;
i = Sp.BytesToRead;
if (i > 0)
{
try
{
strTemp += Sp.ReadExisting();
}
catch
{ }
if (strTemp.ToLower().IndexOf("\r") < 0)
{
i = 0;
}
else
{
this.Invoke(interfaceUpdataHandle, strTemp);
}
}
}
// do null
}
private SerialPort Sp = new SerialPort();
Sp.PortName = this.comboBox2.Text.Trim();
Sp.BaudRate = Convert.ToInt32(this.comboBox1.Text.Trim());
Sp.Parity = Parity.None;
Sp.StopBits = StopBits.One;
Sp.DataReceived += new SerialDataReceivedEventHandler(Sp_DataReceived);
以上是我使用SerialPort类去读取串口数据的部分代码,我用了SerialDataReceivedEventHandler(Sp_DataReceived)去调用函数Sp_DataReceived去读取数据。可程序执行到Sp.DataReceived += new SerialDataReceivedEventHandler(Sp_DataReceived)时,程序没有进入函数Sp_DataReceived。请问这是为什么呢??急急急急...........
[解决办法]
串口收到数据,
然后是收到数据弹出窗口。
上面的语法要跨线程,并且又有datareceived事件。由于datareceived事件触发的条件有点点复杂,需要弄懂,再跨线程调用窗体语法很复杂。
就把程序分拆开,先用较简单的方法确认有没有收到数据。再收到数据后显示窗体。
功能完成以后再用这样的“精简”的代码。
加个定时器,然后定时用sp.readexist()读串口数据。
如果有数据了看看收到的数据对不对。
然后再改为用datareceived收数据。
另外datareceived手数据好像要用Thread.Sleep()来延时,以确保把数据收完。
[解决办法]
如果你实验的时候是com1接com2,一个用串口精灵发,一个用你的程序收,记得要用交叉线,用直连线是肯定收不到的(串口线有两种)
你先用串口精灵看看能不能收到数据,未必是程序的问题。
[解决办法]
一般串口收发数据就用一个串口头,把收发的两个引脚(2脚和3脚)短接就行了。这样发的时候串口也收到数据了。
------解决方案--------------------
既然电子秤使用的是COM3 你打开COM1和COM2去测试 肯定收不到数据啊
这种电子秤应该是采用的USB模拟串口技术 COM3就是他虚拟出来的串口 你把你的sp指向COM3然后在打开试试
[解决办法]
= =我说的是你用串口精灵测试的时候采用这种接线方法。。。先检测下你的程序能不能用
USB的我没做过