• 全部
  • C#综合技术
  • C#互联网桌面应用
  • AppLauncher
  • WinForm&WPF
  • C#开发新技术
  • 问答

wince下读串口SerialPort.DataReceived问题

airskys 2010-05-25 11:40:29
wince是5.0
开发工具用的是vs2005
从工具箱拖SerialPort出来,使用其DataReceived来接受处理到的数据
发现一个问题
串口打开后,只能接收一次数据,后面的就接收不到了
除非你关闭串口,再次打开,这样才能接收到新的数据
不知道有没有人也碰到这样的情况
帮忙求解决
网上查资料有人说是SerialPort的bug问题,不知道是真的假的
...全文
445 点赞 收藏 16
写回复
16 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
katzel 2010-10-02
用过WINCC,没用过WINCE
回复
tony0121 2010-10-02
遇到同样问题,现在比较郁闷,唯一想到的方法是在DataReceived事件中开关一次port
private void DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
string temp = s_port.ReadExisting();
label1.BeginInvoke(new myDelegate(updateLabel));

if (s_port.IsOpen)//open port
s_port.Close();
//sense port
s_port.PortName = "COM3";
s_port.BaudRate = 115200;
s_port.Parity = System.IO.Ports.Parity.None;
s_port.DataBits = 8;
s_port.StopBits = System.IO.Ports.StopBits.One;

s_port.Open();
}
回复
兔子党-顾问 2010-05-26
不要再说pc上没问题……
请先将你的杯子倒空
否则所有的错误可能都将被掩盖,毕竟网络沟通很麻烦,我们需要多次确认才能找到问题根源,wince和pc有些机制不同,主要是ui方面。
回复
兔子党-顾问 2010-05-26
就你的代码而言,我只能说是猜测

//这句会不会因为字符编码及问题而出错?因为串口一般是ascii编码,很少用其他的编码,Encoding.Default是unicode
char[] cpara = System.Text.Encoding.Default.GetChars(chrdata);
//这行,你不如直接Encoding.Ascii.GetString()了
str = new String(cpara);
//你尝试吧这行注释掉。改为:
//File.Append方式,追加到文件中。看是否还是只执行1次。
this.BeginInvoke(new ReadScanData(OnReadScanData), str);



你这里的处理方式上,
1.不要再DataReceived事件中再次等待了。没有意义
2.如果要的是文本,你可以设置SerialPort对象的Encoding属性(如果有必要的话,不使用ascii的情况下,你设置,默认是Encoding.Ascii)
3.你一行就可以解决的,DataReceived事件中,只写一句:
this.BeginInvoke(OnReadScanData, spScanSerial.ReadExisting());
回复
airskys 2010-05-26
[Quote=引用 9 楼 wuyazhe 的回复:]

-_-

我知道了。我显然知道你的程序在wince才出问题。我做wince开发5年多了。设备很全。如果你代码是在大项目里的,就贴关键的部分,或是datareceived方法,往往这样的问题和ui界面有关。
[/Quote]
谢谢你的回复
回复
airskys 2010-05-26
我用的是arm atmel 的9263cpu
串口也是三线的串口
回复
airskys 2010-05-26

private void spReceive_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
byte[] chrdata=null;
int iLen ;
string str=null;
Thread.Sleep(100);
iLen =spScanSerial .BytesToRead;
if (iLen > 0)
{
chrdata = new byte[iLen];
spScanSerial.Read(chrdata, 0, iLen);
char[] cpara = System.Text.Encoding.Default.GetChars(chrdata);
str = new String(cpara);
this.BeginInvoke(new ReadScanData(OnReadScanData), str);
}
}



就是这段代码,在OnReadScanData里面我把str的值显示到界面上
但是只能显示一次,我用扫描枪再扫描的话这个事件就不会再触发
回复
Joe-xXx 2010-05-25
MSDN查查SerialPort,先看看基础的吧
回复
lexfu 2010-05-25
帮 顶
回复
水哥阿乐 2010-05-25
帮 顶
回复
兔子党-顾问 2010-05-25
-_-

我知道了。我显然知道你的程序在wince才出问题。我做wince开发5年多了。设备很全。如果你代码是在大项目里的,就贴关键的部分,或是datareceived方法,往往这样的问题和ui界面有关。
回复
airskys 2010-05-25
谢谢你的回复
不过我的问题是DataReceived这个事件只会触发一次,等你读完数据后就不在被触发了
但是com的状态是连接的
这个是在wince下才有的
我在一般电脑里面是没有问题的

[Quote=引用 5 楼 wuyazhe 的回复:]

没写完的串口系列。你凑合看看1,2先
C# 串口操作系列(1) -- 入门篇,一个标准的,简陋的串口例子。
C# 串口操作系列(2) -- 入门篇,为什么我的串口程序在关闭串口时候会死锁 ?
[/Quote]
回复
兔子党-顾问 2010-05-25
如果你调不好。可以发给我帮你看看。wuyazhe@yeah.net
回复
兔子党-顾问 2010-05-25
serialport很多人说不好使,我也曾信以为真。用来3年了,05年到现在。哦。居然5年了。现在觉得蛮好的。
回复
airskys 2010-05-25
不是基础的问题
是wince的问题
同样的程序在xp下一点问题都没有
回复
发帖
C#
创建于2007-09-28

10.5w+

社区成员

.NET技术 C#
申请成为版主
帖子事件
创建了帖子
2010-05-25 11:40
社区公告

让您成为最强悍的C#开发者