我用你写的串口类写了一个通信程序,发觉有一个问题:就是在每次重起计算机后,在没有别的软件对COM1(假设用COM1)进行过OPEN 操作的话,直接用你的类里的初始化COM1 然后发送数据,可是接收到的是乱码;但是,我先用别的串口软件,先OPEN 一下COM1,然后再用你的类去初始化COM1,然后再发送数据就不会出现乱码了;问题:为什么在重起电脑之后,用你的类 打开串口,发送数据会出现乱码?
希望 “fsdy2000(乡愁)“ 进来看看,找找原因。
fsdy2000(乡愁) 写的串口发送的地址:
http://community.csdn.net/Expert/topic/4403/4403713.xml?temp=.8694269
解决方案 »
- 怎么设计一个类,能够监视这个类的任何属性是否被修改过(不需要修改所有属性的set函数的情况下)
- 请教一下可以无文件的方式让记事本显示字符串吗?
- 奇怪的FormatExcption
- 谁用c#写过读取本地cookie内容的的类
- 求:彩色转黑白图像的函数,不要用gray=(r*3+g*5+b)/9太慢了
- 请问怎样将水晶报表交叉表的汇总字段分两列显示,就是分为"和"与"平均值"两列?默认是一列显示两个值.
- 如何用C#建立一个绘图板
- 在创建COM中, 什么是托管和非托管??
- 急!在ASP.NET中使用CrystalReport时,提示错误“未将对象引用设置到对象的实例”。
- SqlServer 里链接数为100多,,,不知道 为什么....
- c# 事件和代理的区别?
- 请问一个很弱的问题:如何在构造函数中初始化成员
[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()进行编解码。具体编码自己定。
这个代码我用过,另外也有一些朋友在使用。目前还没发现相同的问题,发生乱码也是编码的问题。
针对你的问题,我有以下一些想法:
DWORD在c#没有同名的类型,DWORD是32位的无符号整型,你可以用C#中对应的数据类型。
定义的参数可以从参数名中知道其含义,如果你的项目中设置参数不一样可以作相应更改。
你的问题集中在CreateFile上面,你可以看一下MSDN中的createFile,里面有详细的说明。是Wind32的API
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,另外,还有一个两个串口的多串口卡;
而通过别的软件先打开一下关闭后,再用你的类来发送数据时的hComm=3708 ;难道问题就出在这里??????????
建议你先用一个串口虚拟工具,在一台机器上进行从COM1到COM2的发送和接收。
你用其发送,那么在接收端你用System.Text.UTF8Encoding.GetString()来将数组转为字符串了吗?