Form1.cs
 public Form1()
        {
            InitializeComponent();
        }      
        //初始化SerialPort对象方法.PortName为COM口名称,例如"COM1","COM2"等,注意是string类型
       public void InitCOM(string PortName)
         {
             serialPort1 = new SerialPort(PortName);
             serialPort1.BaudRate = 9600;//波特率
             serialPort1.Parity = Parity.None;//无奇偶校验位
             serialPort1.StopBits = StopBits.Two;//两个停止位
             serialPort1.Handshake = Handshake.RequestToSend;//控制协议
             serialPort1.ReceivedBytesThreshold = 4;//设置 DataReceived 事件发生前内部输入缓冲区中的字节数
           
        }        
 
         //打开串口的方法
         public void OpenPort()
         {
             try
             {
                 serialPort1.Open();
             }
             catch { }
             if (serialPort1.IsOpen)
             {
                 Console.WriteLine("the port is opened!");
             }
             else
            {
                 Console.WriteLine("failure to open the port!");
             }
         }         //关闭串口的方法
         public void ClosePort()
         {
             serialPort1.Close();
             if (!serialPort1.IsOpen)
            {
                 Console.WriteLine("the port is already closed!");
             }
        }
  
        
         
         //调用实例,发送数据
        
        private void button1_Click(object sender, EventArgs e)
        {
            InitCOM("COM3");
            OpenPort();            byte[] data = Encoding.Unicode.GetBytes(this.textBox1.Text);
            string str = Convert.ToBase64String(data);
            serialPort1.WriteLine(str);
            ClosePort();
            MessageBox.Show(this, "利用串口成功发送数据!", "信息提示", MessageBoxButtons.OK, MessageBoxIcon.Information);        }        //接收数据
        private void button2_Click(object sender, EventArgs e)
        {
            try
            {
                byte[] datar = Convert.FromBase64String(serialPort1.ReadLine());
                textBox2.Text = Encoding.Unicode.GetString(datar);
                ClosePort();
                MessageBox.Show(this, "利用串口成功接收数据!", "信息提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
            catch
            {
                ClosePort();
                MessageBox.Show(this, "利用串口接收数据失败!", "信息提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
        }       以上代码,测试能发送成功,但是就是接收不到,而且点接收按钮后,程序就像死在那了,点哪都动不了了。因为刚接触
rs232接口编程,有些东西还不太懂,请各位前辈指点迷津,万分感谢!!!!或是前辈有更好的 rs232串口例子程序,可以给演示一下,最后是自己实际测试成功的源码,因为在网上我试了很很多的代码,都是测试不成功。

解决方案 »

  1.   

    本帖最后由 bdmh 于 2012-04-01 09:12:53 编辑
      

  2.   

    楼上,感谢了!!serialPort1.WriteLine(str);之后,你关闭了com 即 ClosePort();这样会清空缓冲区的----------------------------------------
    ClosePort(); 原程序没有,是我后加的,因为,我写了一次后,当我再写一次的时候,就说 Com3 无法写入数据,所以,我就试验性的给关了,既使不关,接收数据也是不成功!
      

  3.   

    已能实现收发信通信,但是有一个问题就是我发一个数据,比如:126.985645为什么接收回来的数据会被截断,形如:正常应该是,------------------------------------客户端COM4口接收到数据:126.985645但是有时候会变成:客户端COM4口接收到数据:12
    客户端COM4口接收到数据:6.98
    客户端COM4口接收到数据:5645
    就是说,把一个发送来的整数据 126.985645,接收的时候,分成3段接收了这是怎么回事,在要什么地方调整参数呢?我对串口的设置是这样的:----------------------------
                m_portA = new SerialPort();
                m_portA.PortName = "COM4";
                m_portA.BaudRate = 9600;//波特率
                m_portA.Parity = Parity.None;//无奇偶校验位
                m_portA.DataBits = 8;
                m_portA.StopBits = StopBits.One;//一个停止位
                m_portA.RtsEnable = true;
                m_portA.DtrEnable = true;
                m_portA.Handshake = Handshake.RequestToSend;//控制协议
                m_portA.ReceivedBytesThreshold = 1;
                m_portA.ReadTimeout = 5000;//读取超时时间
                m_portA.WriteTimeout = 5000;//写入超时时间
                m_portA.DataReceived += new SerialDataReceivedEventHandler(m_portA_DataReceived);
                m_portA.Open();
           void m_portA_DataReceived(object sender, SerialDataReceivedEventArgs e)
            {
                byte[] buf = new byte[512];
                int n = m_portA.Read(buf, 0, buf.Length);
                string text = Encoding.Default.GetString(buf, 0, n);
                this.Invoke((EventHandler)delegate
                {
                    txbLog.Text += "\r\n客户端COM4口接收到数据:" + text;
                });
            }
      

  4.   

    (m_portA.ReadBufferSize=1024;)问题感觉不是输入缓冲区不够大,你给发出的指令加上"+ (char)3 +(char)13"看看
      

  5.   

    1楼的解释是对的,不能open并发送后立即close,这样发送出去的会被清掉。所以你什么也收不到。
    为serialport实例增加一个receivedata的委托。
      

  6.   

    是异步的方式接受的是么? 改成while(true)方式去接收信息试试看,
      

  7.   

          InitCOM("COM3");
                OpenPort();            byte[] data = Encoding.Unicode.GetBytes(this.textBox1.Text);
                string str = Convert.ToBase64String(data);
                serialPort1.WriteLine(str);
                ClosePort();
                MessageBox.Show(this, "利用串口成功发送数据!", "信息提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
    这句closePort()不能关闭的,
    还有接收数据的closePort也是不能关闭的,一般串口通讯有两种方式,一种是中断法,就是事件触发,一种是查询,定时去查
      

  8.   

    已能实现收发信通信,但是有一个问题就是我发一个数据,比如:126.985645为什么接收回来的数据会被截断,形如:正常应该是,------------------------------------客户端COM4口接收到数据:126.985645但是有时候会变成:客户端COM4口接收到数据:12
    客户端COM4口接收到数据:6.98
    客户端COM4口接收到数据:5645
    就是说,把一个发送来的整数据 126.985645,接收的时候,分成3段接收了这是怎么回事,在要什么地方调整参数呢?我对串口的设置是这样的:----------------------------C# code            m_portA = new SerialPort();
                m_portA.PortName = "COM4";
                m_portA.BaudRate = 9600;//波特率
                m_portA.Parity = Parity.None;//无奇偶校验位
                m_portA.DataBits = 8;
                m_portA.StopBits = StopBits.One;//一个停止位
                m_portA.RtsEnable = true;
                m_portA.DtrEnable = true;
                m_portA.Handshake = Handshake.RequestToSend;//控制协议
                m_portA.ReceivedBytesThreshold = 1;
                m_portA.ReadTimeout = 5000;//读取超时时间
                m_portA.WriteTimeout = 5000;//写入超时时间
                m_portA.DataReceived += new SerialDataReceivedEventHandler(m_portA_DataReceived);
                m_portA.Open();
           void m_portA_DataReceived(object sender, SerialDataReceivedEventArgs e)
            {
                byte[] buf = new byte[512];
                int n = m_portA.Read(buf, 0, buf.Length);
                string text = Encoding.Default.GetString(buf, 0, n);
                this.Invoke((EventHandler)delegate
                {
                    txbLog.Text += "\r\n客户端COM4口接收到数据:" + text;
                });
            }
    截断是对的,因为他是有一个事件就会触发,你发送的时候要加头,如$,加尾如*,然后接收的时候去头,去尾即可
      

  9.   

    这个应该用事件来接收数据,serialPort.DataReceived 事件
      

  10.   

    最后的问题 截断数据,加一个延时Thread.Sleep(100);就好了没有人回答对,自己有网上搜的,一试,果然解决问题
      

  11.   


    你好,我也遇到同样的问题,你说的时间延迟是主线程延迟,让读取数据的线程取数据吗?但我看你的代码都是在主线程里,能否参考一下你的代码?
    我的QQ邮箱 [email protected]非常感谢!!!