我用你写的串口类写了一个通信程序,发觉有一个问题:就是在每次重起计算机后,在没有别的软件对COM1(假设用COM1)进行过OPEN 操作的话,直接用你的类里的初始化COM1 然后发送数据,可是接收到的是乱码;但是,我先用别的串口软件,先OPEN 一下COM1,然后再用你的类去初始化COM1,然后再发送数据就不会出现乱码了;问题:为什么在重起电脑之后,用你的类 打开串口,发送数据会出现乱码?
希望  “fsdy2000(乡愁)“ 进来看看,找找原因。
fsdy2000(乡愁) 写的串口发送的地址:
http://community.csdn.net/Expert/topic/4403/4403713.xml?temp=.8694269

解决方案 »

  1.   

    你可以这样来试试:read和write方法都是用的byte[]作参数。你在提供时对数据进行编码,如System.Text.UTF8Encoding.GetBytes()或GetString()进行编解码。具体编码自己定。
      

  2.   

    fsdy2000(乡愁) 你试过没有??怎么解决这个问题?
      

  3.   

    通过程序的监视:发现问题不是出在"用的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()进行编解码。具体编码自己定。
      

  4.   

    fsdy2000(乡愁) 呢?怎么不见人影啦?
      

  5.   

    不好意思,我一直在外出差。
    这个代码我用过,另外也有一些朋友在使用。目前还没发现相同的问题,发生乱码也是编码的问题。
    针对你的问题,我有以下一些想法:
    DWORD在c#没有同名的类型,DWORD是32位的无符号整型,你可以用C#中对应的数据类型。
    定义的参数可以从参数名中知道其含义,如果你的项目中设置参数不一样可以作相应更改。
    你的问题集中在CreateFile上面,你可以看一下MSDN中的createFile,里面有详细的说明。是Wind32的API
      

  6.   

    真的好奇怪哦,
    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,另外,还有一个两个串口的多串口卡;
      

  7.   

    可是我用别的串口软件先打开一下这个串口后,再调用你的类来发送数据,这时候就可以了,他就不会出错了;同时也发现了一个问题:先前在没有别的串口软件打开过这个串口时的 hComm=3724   ;
    而通过别的软件先打开一下关闭后,再用你的类来发送数据时的hComm=3708  ;难道问题就出在这里??????????
      

  8.   

    接上面,不过,我停止过程序后再运行时,hComm=3724啦   ,还是可以正确接收数据,看来,又不知道是哪里的原因了!!!
      

  9.   

    hComm只是返回可操作comm的句柄。根据你说的情况,你看一下接收那端的编码情况。
    建议你先用一个串口虚拟工具,在一台机器上进行从COM1到COM2的发送和接收。
      

  10.   

    我也改用System.Text.UTF8Encoding.GetBytes() 来给数组赋值了,也不行;
    你用其发送,那么在接收端你用System.Text.UTF8Encoding.GetString()来将数组转为字符串了吗?
      

  11.   

    你有妨发程序给我。[email protected]
      

  12.   

    fsdy2000(乡愁) 我已经发送过去啦
      

  13.   

    如果两方都是用这个类写的,就没有问题,如果有一方是用别的写的,那么用fsdy2000(乡愁) 的类写的,向另一方发送就会有问题(在重起电脑后,没有别的串口软件打开过这个串口的情况下)