我用C#写的串口通讯软件,串口通讯类用的是.Net的SerialPort类。
不知道为什么,同样的操作,有时候PDA发送的数据能够接收到,有时候接收不到。
而以前别人用Delphi写的串口通讯软件都能和PDA正常通讯。(和我现在做的这个功能一模一样,也是与PDA通讯)并且我们的串口参数:波特率等都设置的一样。

解决方案 »

  1.   

    我以前GOOGLE到的代码:using System.IO.ports;SerialPort myPort = new SerialPort(); //初始化端口:
    myPort.PortName = "com1"; //端口名
    myPort.BaudRate = 115200; //速率
    myPort.DataBits = 8; //数据位 
    myPort.StopBits = StopBits.One; //停止位
    myPort.Parity = Parity.None; //奇偶校验
    myPort.RtsEnable = true; // 打开RTS ,这步很重要//下面这个方法将在指定的时间内接收串口数据并写入二进制文件。public void getRawData(SerialPort port, string fileName, int seconds)
    {
        FileStream f1;
        try
        {
           port.open(); // 打开端口
        }
        catch (Exception err)
        {
         Console.WriteLine(err.ToString()); //端口打开失败,返回
           return;
        }
        try
        {
           f1 = new FileStream(fileName, FileMode.Append);
        }
        catch (Exception err)
        {
           Console.WriteLine(err.ToString()); //文件打开失败,返回
           return;
        }
     
        Console.WriteLine("Data will be logged from " + port.PortName + " for " + seconds + " seconds...");
         BinaryWriter b1 = new BinaryWriter(f1);
         DateTime now = DateTime.Now; // 获取当前系统时间
         while (((TimeSpan)(DateTime.Now - now)).TotalSeconds < seconds) 检测当前时间是否到了指定结束时间长度
         {
             b1.Write((byte)port.ReadByte()); //写串口数据到文件
         }
     
       b1.Close();
       f1.Close();
      port.Close();
    }
      

  2.   

    PDA的AT命令应该不太一样吧,看看AT命令参考。
      

  3.   

    串口通信的特点就是不可靠,很可能不定时的才能填满接收缓冲区。1. 要么分成很小的包,连续发送,接收处理。(程序设计方面)2. 你说的可能不是接收不到,虽然触发了接收事件,但是数据只过来了一部分。
    假设在接收事件中,触发了事件,你不能马上提取数据处理, 做一个小的延时,500-1000 毫秒,这样效果会更好,缓冲区会填冲更多数据,可以提高接收完整的比率。建议,在发送端给流加上crc验证,接收端加上延时和crc验证包完整度,这样的通信更可靠,更准确。
      

  4.   

    如果连接都没有问题的话,应该就是数据接收不完全,需要延迟接收,建议使用SerialPort 试试
      

  5.   

    .net compact的串口操作有问题,用opennetcf或者自己写咯,用P/Invoke调用CreateFile这些函数
      

  6.   

    SerialPort类有一个接收数据的事件DataReceived,触发这个事件时,再去读取数据。读不到数据也可能是缓存区没有及时清理的问题。 这是做串口设备时的解决办法,不知道对你的问题有没有帮助。
      

  7.   


    myPort.RtsEnable = true; // 打开RTS ,这步很重要
    我的RtsEnable 默认是false,程序也没有改动,是不是这个问题?
      

  8.   


            private void Form2_Load(object sender, EventArgs e)
            {
                try
                {                //设置焦点在发送框
                    this.txtSend.Focus();
                    //设置发送框的光标位置
                    txtSend.SelectionStart = txtSend.Text.Length;
                    txtSend.ScrollToCaret();                //加载端口参数配置
                    PortConfig.SetPortPara(spComPort);
                    //打开串口连接
                    spComPort.Open();
                }
                catch (Exception ex)
                {
                    ShowMessageBox.Message_Information(ex.Message);
                }
            }        #region 配置串口参数
            /// <summary>
            /// 配置串口参数
            /// </summary>
            /// <param name="spPort"></param>
            public static void SetPortPara(SerialPort com)
            {
                try
                {
                    //串口连接的奇偶校验位
                    setParity(com);
                    //串口连接的停止位数
                    setStopBits(com);
                    //串口连接的流控制
                    setHandshake(com);
                    //数据位
                    setDataBits(com);
                    //波特率
                    setBaudRate(com);
                    //COM端口
                    setPortName(com);                //com.ReadTimeout = 1000;
                    //com.Encoding = Encoding.GetEncoding("gb2312");
                }
                catch (Exception ex)
                {
                    throw ex;
                }
            }        /// <summary>
            /// 接收数据
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            private void spComPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
            {
                try
                {
                    //检查串口是否打开,若未则打开
                    if (spComPort.IsOpen == false)
                    {
                        spComPort.Open();
                    }                //获取接收数据的字节数组
                    byte firstByte = Convert.ToByte(spComPort.ReadByte());
                    int bytesRead = spComPort.BytesToRead;
                    byte[] byteData = new byte[bytesRead + 1];
                    byteData[0] = firstByte;
                    for (int i = 1; i <= bytesRead; i++)
                    {
                        byteData[i] = Convert.ToByte(spComPort.ReadByte());
                    }                //解析接收到得数据码
                    ResolveAcceptData(byteData);
                }
                catch (Exception ex)
                {
                    ShowMessageBox.Message_Information(ex.Message);
                }
            }
      

  9.   

    private void spComPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
    {
    // 添加一个500 毫秒的延时
    thread.sleep(500);
    ...
    ...
    ...
    }