“fsdy2000(乡愁)“请进:你 写的串口发送有问题,” 当重起电脑后,用这个类发送数据是乱码 +++++100问题!超级送分!!

xieyongxiang 2005-12-20 06:09:53

我用你写的串口类写了一个通信程序,发觉有一个问题:就是在每次重起计算机后,在没有别的软件对COM1(假设用COM1)进行过OPEN 操作的话,直接用你的类里的初始化COM1 然后发送数据,可是接收到的是乱码;

但是,我先用别的串口软件,先OPEN 一下COM1,然后再用你的类去初始化COM1,然后再发送数据就不会出现乱码了;

问题:为什么在重起电脑之后,用你的类 打开串口,发送数据会出现乱码?


希望 “fsdy2000(乡愁)“ 进来看看,找找原因。


fsdy2000(乡愁) 写的串口发送的地址:
http://community.csdn.net/Expert/topic/4403/4403713.xml?temp=.8694269
...全文
220 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
fsdy2000 2006-01-01
  • 打赏
  • 举报
回复
我觉得你考虑一下是否是其他原因。用超级终端接收也正常啊。
kenny_xie 2005-12-31
  • 打赏
  • 举报
回复
如果两方都是用这个类写的,就没有问题,如果有一方是用别的写的,那么用fsdy2000(乡愁) 的类写的,向另一方发送就会有问题(在重起电脑后,没有别的串口软件打开过这个串口的情况下)
xieyongxiang 2005-12-28
  • 打赏
  • 举报
回复
fsdy2000(乡愁) 我已经发送过去啦
fsdy2000 2005-12-28
  • 打赏
  • 举报
回复
你有妨发程序给我。fsdy2000@163.com
fsdy2000 2005-12-28
  • 打赏
  • 举报
回复
我也改用System.Text.UTF8Encoding.GetBytes() 来给数组赋值了,也不行;
你用其发送,那么在接收端你用System.Text.UTF8Encoding.GetString()来将数组转为字符串了吗?
fsdy2000 2005-12-28
  • 打赏
  • 举报
回复
hComm只是返回可操作comm的句柄。根据你说的情况,你看一下接收那端的编码情况。
建议你先用一个串口虚拟工具,在一台机器上进行从COM1到COM2的发送和接收。
xieyongxiang 2005-12-27
  • 打赏
  • 举报
回复
接上面,不过,我停止过程序后再运行时,hComm=3724啦 ,还是可以正确接收数据,看来,又不知道是哪里的原因了!!!
xieyongxiang 2005-12-27
  • 打赏
  • 举报
回复
可是我用别的串口软件先打开一下这个串口后,再调用你的类来发送数据,这时候就可以了,他就不会出错了;

同时也发现了一个问题:先前在没有别的串口软件打开过这个串口时的 hComm=3724 ;
而通过别的软件先打开一下关闭后,再用你的类来发送数据时的hComm=3708 ;难道问题就出在这里??????????
xieyongxiang 2005-12-27
  • 打赏
  • 举报
回复
真的好奇怪哦,
1、我都已经打开了串口: hComm=3724 ,也用过异步方式,还是不能解决;

2、在最后一步发送数据时:WriteFile(hComm,WriteBytes,WriteBytes.Length,ref BytesWritten,ref ovlCommPort);
我也查看了WriteBytes 的数据,也是对的,可以对方接收的数据不对,全是问号“????”;

3、我也改用System.Text.UTF8Encoding.GetBytes() 来给数组赋值了,也不行;

4、public byte StopBits; // 0,1,2 = 1, 1.5, 2 好像没有看到在类里面或DCB 结构里面对StopBits给变为:我赋0,程序自动变成1呀?
可即使这样,我也将StopBits =0 或1 过啊(我的接收方的StopBits=1);

很郁闷哦,难道是我的操作系统的问题?
我用的是XP,另外,还有一个两个串口的多串口卡;
fsdy2000 2005-12-24
  • 打赏
  • 举报
回复
不好意思,我一直在外出差。
这个代码我用过,另外也有一些朋友在使用。目前还没发现相同的问题,发生乱码也是编码的问题。
针对你的问题,我有以下一些想法:
DWORD在c#没有同名的类型,DWORD是32位的无符号整型,你可以用C#中对应的数据类型。
定义的参数可以从参数名中知道其含义,如果你的项目中设置参数不一样可以作相应更改。
你的问题集中在CreateFile上面,你可以看一下MSDN中的createFile,里面有详细的说明。是Wind32的API
xieyongxiang 2005-12-23
  • 打赏
  • 举报
回复
fsdy2000(乡愁) 呢?怎么不见人影啦?
xieyongxiang 2005-12-22
  • 打赏
  • 举报
回复
通过程序的监视:发现问题不是出在"用的byte[]作参数" 这里,而是在打开串的方式,应该是里的参数的问题,因为我监控到真把发送时,数据都还是正确的,可是对方接收却是乱码(我过很多串口调试软件和自己写的软件来接收都一样)
[DllImport("kernel32.dll")]
private static extern int CreateFile(
string lpFileName, // 要打开的串口名称
uint dwDesiredAccess, // 指定串口的访问方式,一般设置为可读可写方式
int dwShareMode, // 指定串口的共享模式,串口不能共享,所以设置为0
int lpSecurityAttributes, // 设置串口的安全属性,WIN9X下不支持,应设为NULL
int dwCreationDisposition, // 对于串口通信,创建方式只能为OPEN_EXISTING
int dwFlagsAndAttributes, // 指定串口属性与标志,设置为FILE_FLAG_OVERLAPPED(重叠I/O操作),指定串口以异步方式通信
int hTemplateFile // 对于串口通信必须设置为NULL
);

// 打开串口 OPEN THE COMM PORT.
hComm = CreateFile(PortNum ,GENERIC_READ | GENERIC_WRITE,0, 0,OPEN_EXISTING,0,0);

第3个参数一定要为0,第4、7参数为NULL,但为什么写为0,第六个你设的是为同步,如为异步方式必须指定 FILE_FLAG_OVERLAPPED 会不会是同步或异步的原因,才导致乱码??

很有可能是这些参数的问题,还有在C、C++ 等软件里面可以直接用的DWORD 值在这里不能用,相应的DWORD 值又是如何用十六进制来代替呢?就像下面你写的,会不会是准确的?
//win32 api constants
private const uint GENERIC_READ = 0x80000000;
private const uint GENERIC_WRITE = 0x40000000;
private const int OPEN_EXISTING = 3;

如为异步方式必须指定 FILE_FLAG_OVERLAPPED 那又是怎么得到那的十六进制呢??

非常能解决这个问题!!!!!!!!!


-------------------------------------------------
你可以这样来试试:read和write方法都是用的byte[]作参数。你在提供时对数据进行编码,如System.Text.UTF8Encoding.GetBytes()或GetString()进行编解码。具体编码自己定。
xieyongxiang 2005-12-22
  • 打赏
  • 举报
回复
fsdy2000(乡愁) 你试过没有??怎么解决这个问题?
fsdy2000 2005-12-21
  • 打赏
  • 举报
回复
你可以这样来试试:read和write方法都是用的byte[]作参数。你在提供时对数据进行编码,如System.Text.UTF8Encoding.GetBytes()或GetString()进行编解码。具体编码自己定。

110,533

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

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

试试用AI创作助手写篇文章吧