zoukankan      html  css  js  c++  java
  • 转载:c# serialport类 串口通信 hello world

    据说明天样片就寄来了,可是我的pc端串口还未做,以为很难,就拖着,看了http://www.cnblogs.com/tuyile006/archive/2008/10/06/514300.html
    之后更是一头雾水

    今天下狠心,没想到不到两小时就解决了,做个教程方便大家。

    使用serialport类,C#自带的
    第一个例子参见http://book.csdn.net/bookfiles/499/10049917236.shtml

    首先是在一台pc同一个串口上实现数据收发。那么需要把TX和RX短接。

    我等软件专业的哪有什么做跳线的母头、导线啊,我就在程序运行时拿钥匙把那两个脚短接了。
    public partial class Form1 : Form
        {
            SerialPort serialPort1 = new SerialPort();

    创建一个对象serialPort1,然后剩下的代码参见 http://book.csdn.net/bookfiles/499/10049917236.shtml

    第二个例子,上位机与下位机的通信,以上链接里的例子我觉得没有什么意义。我决定自己写一个读
    mini2440开发板串口的例子。就像DNW那样的。

    将第一个例子里接受按钮的事件处理改为

    private void button2_Click(object sender, EventArgs e)
            {
                serialPort1.PortName = "COM1";
                serialPort1.BaudRate = 115200;
                serialPort1.DataBits = 8;
                serialPort1.ReceivedBytesThreshold = 1;
                serialPort1.Open();

            }

    因为我们想异步读取,总不能在 private void button2_Click(object sender, EventArgs e)里写个死循环
    一直读吧。我就想弄个事件驱动,如果这个serialport也不是窗体控件,我只要选中它,在属性里很容易就找到相关事件,然后双击就可以添加事件处理方法了。可惜它不是。

    倒还真让我撞大运了, 真找到了答案
    ReceivedBytesThreshold 属性, 当缓冲区的数据字节数大于等于SeralPort类对象的ReceivedBytesThreshold值时DataReceived事件被触发

    先在frm1里添加一个方法,就是每当读入一个byte就执行的方法,将读入的byte转化为ascii码
    void   ps_DataReceived(object   sender,   SerialDataReceivedEventArgs   e)   
                      {
                          string sValue;
                          byte[] bs;             
                          bs = System.BitConverter.GetBytes(serialPort1.ReadByte());
                          sValue = System.Text.Encoding.ASCII.GetString(bs);
                          textBox2.Text += sValue;
                      }
    然后就是注册这个事件
    serialPort1.DataReceived += new SerialDataReceivedEventHandler(ps_DataReceived);

    测试时说跨线程调用windows窗体控件,这个.net freamwork2还真是烦人,直接设
    Control.CheckForIllegalCrossThreadCalls = false;

    即 public Form1()
            {
                InitializeComponent();
                serialPort1.DataReceived += new SerialDataReceivedEventHandler(ps_DataReceived);
                Control.CheckForIllegalCrossThreadCalls = false; 
            }

    好了,demo完成了

    最后想当然的关闭串口,也不知道放的位置对否
    private void Form1_FormClosing(object sender, FormClosingEventArgs e)
            {
                serialPort1.Close();
            }  

    作者:罗敏贵
    邮箱:minguiluo@163.com
    QQ群:34178394 建群 主要是寻找志同道合的人士一起学习和讨论自己的所学所思
    出处:http://luomingui.cnblogs.com/
    说明:专注于微软平台项目架构、熟悉设计模式、架构设计、敏捷个人和项目管理。现主要从事WinForm、ASP.NET、等方面的项目开发、架构、管理工作。文章为作者平时里的思考和练习,可能有不当之处,请博客园的园友们多提宝贵意见。
    知识共享许可协议本作品采用知识共享署名-非商业性使用-相同方式共享 2.5 中国大陆许可协议进行许可。

  • 相关阅读:
    Troubleshooting MySQL Memory Usage
    Innodb Log checkpointing 和 dirty Buffer pool pages的关系
    MySQL pager 命令有趣的用法
    测定INNODB REDO LOGS的写入量
    max_allowed_packet & Mysqldump
    链接MyISAM文件
    RFID常识
    C++的程序的文件结构(zt)
    使用C#开发ActiveX控件(zt)
    RFID自动识别术语解释(zt)
  • 原文地址:https://www.cnblogs.com/luomingui/p/2222235.html
Copyright © 2011-2022 走看看