EDN首页   博客首页

日志档案

发表于 2008-7-30 20:10:09

2

标签: serialPort  通讯  Modbus  Windows  Mobile  

Windows Mobile 6下使用serialPort控件进行串口通讯。

在仪表的Modbus通讯中,上位机可以是PLC、PC、PDA或智能手机。本人使用Windows Mobile 6操作系统下的多普达P660进行了上位机的编程。现在将调试程序说一下。

使用VS2005进行开发。

控件有3个button,两个TextBox,两个Label和一个SerialPort等。button1打开串口,button2将txtSend的字符发出,接收是自动的。接收txtReceive显示的是字符ASCII码的十进制数字,例如发送“12345”,txtReceive显示为“4950515253”。

txtReceive显示使用了在线程上异步执行指定委托。使用BeginInvoke和delegate完成。

接收使用事件private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO.Ports;
using System.Threading;

namespace modbuscomm
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        private  String strReceive ;
        public delegate void InvokeDelegate();
        public void Display()
        {
            txtReceive.Text = strReceive;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            //更改参数
            serialPort1.PortName = "COM6";
            serialPort1.BaudRate = 9600;
           // serialPort1.Parity = Parity.Odd; 默认是none
            serialPort1.StopBits = StopBits.One;

            //打开串口(打开串口后不能修改端口名,波特率等参数,修改参数要在串口关闭后修改)
            serialPort1.Open();

        }

        private void button2_Click(object sender, EventArgs e)
        {
            //发送数据
            //SendStringData(serialPort1);
            //serialPort1.Write(txtSend.Text);
            //也可用字节的形式发送数据
            SendBytesData(serialPort1); 
        }
 

  //发送字符串数据
                private   void   SendStringData(SerialPort   serialPort)
                {
                        serialPort.Write(txtSend.Text);
                }


                //发送二进制数据
                private   void   SendBytesData(SerialPort   serialPort)
                {
                        byte[]   bytesSend="System".Text.Encoding.Default.GetBytes(txtSend.Text   );
                        serialPort.Write(bytesSend,   0,   bytesSend.Length);
                }

        private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {

                //   接收缓冲区中数据的字节数
                int int_Len = serialPort1.BytesToRead;

                //   接收数据
                byte[] bytes = new byte[int_Len];
                serialPort1.Read(bytes, 0, int_Len);


                //   将数据存入字符串缓冲区中
                for (int i = 0; i < bytes.Length; i++)
                {
                    strReceive += bytes[i];
                }
                strReceive += "";
           
            txtReceive.BeginInvoke(new InvokeDelegate(Display));
        }

       } 
}  

 

系统分类: 工业控制   |   用户分类: 仪表-软件-通讯   |   来源: 原创   |   【推荐给朋友】   |   【添加到收藏夹】

    阅读(687)    回复(0)  

投一票您将和博主都有获奖机会!