毕业设计中,用到串口与无人机通信,所以就用到了SerialPort这个类,这个类在设置属性时,

用到最主要的属性应该是COM口和波特率,由于本人不熟悉硬件,不便多说,但经验告诉我是这样的,

还有数据位,停止位,奇偶检验位等,和我合作的同学告诉我,只要给飞控版发指令那么自动会返回

数据,但一开始总是触发不了返回数据事件注册的函数,网上查资料说要设置

port.ReceivedBytesThreshold = 1;这个数据,大概意思是缓存区里有一个字节就去触发指定的

函数,还是不行。后来调换各种数据格式,最后换成byte数组,以最原始的格式定义

byte[] buffer = { 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF };

发送就行了。

资料表明,SerialPort会自动开启一个线程去执行数据回传注册的函数的,

这里由于可能操作到主线程下的控件,所以这里介绍一一下Invoke,

1.Invoke大概意思就是找到定义所属控件的线程去执行相关操作,C#里是

不允许跨线程调用的,(在拥有此控件的基础句柄的线程上执行指定的委托)

当然如果不想麻烦也可以写这样一句话

Control.CheckForIllegalCrossThreadCalls = false;

不检查跨线程的逻辑错误。

2.BeginInvoke:(在创建控件的基础句柄所在线程上异步执行指定的委托)

Invoke的异步版本 (Invoke是同步完成的)。

3.RequireInvoke 可用通过RequireInvoke属性来检测是否需要使用Invoke或则是BeginInvoke去执行相关的操作:

(获取一个值,该值指示调用方在对控件进行方法调用时是否必须调用Invoke方法,因为调用方位于创建控件所在的线程以外)

4.EndInvoke 如果异步执行的委托(BeginInvoke)有返回值,可以通过EndInvoke去获取:(检索由传递的IAsyncResult表示的异步操作返回值)

因为是异步的,所以是另外一个线程去执行,主线程就不可能去等待执行的结果。等待有返回值时会自动得到。

5.代码解析

Serialport port=new SerialPort();//创建Serialport实例
List<string> comList = new List<string>();
for (int i = ; i < ; i++) //查找可用的COM放入combox中
{
port.PortName = "COM" + i;
try
{
port.Open();
comList.Add("COM" + i);
port.Close();
}
catch (Exception)
{ }
} portCbx.DataSource = comList;//以数据源的方式给combox赋值,会把索引为0的数据当作默认选中的值。
//直接用port.Items.Add()方法则不会默认选中值,需要设置SelectedIndex才能达到相同的想过
port.DataReceived += new SerialDataReceivedEventHandler(this.receiveData);//注册接收数据的方法 port.ErrorReceived += Port_ErrorReceived;//注册错误事件的处理方法 int r=port.Read(buffer,0,buffer.Length);//读取接收到的数据,返回的值是接收到数据的个数, buffer.Take(r).ToArray();//拿到真实接收到的数据,

毕设(二)C#SerialPort的更多相关文章

  1. 毕设二:python 爬取京东的商品评论

    # -*- coding: utf-8 -*- # @author: Tele # @Time : 2019/04/14 下午 3:48 # 多线程版 import time import reque ...

  2. 毕业设计(2):基于MicroPython的家庭可燃气体泄露微信报警器

    在我们平时的生活中,经常看到因气体泄漏发生爆炸事故的新闻.房屋起火.人体中毒等此类的新闻报道层出不穷.这种情况下,人民就发明了可燃气体报警器.当工业环境.日常生活环境(如使用天然气的厨房)中可燃性气体 ...

  3. 弄懂CNN,然后提升准确率4.21-4.27

    英语: 1.每天背单词,75起步.(这周没怎么背,考虑调整了) 2.并背王江涛图画作文一:传统文化(这周没背,但肯定要做) 学校: 0.吴恩达ML 1.毕设一:可视化,肺癌基因突变,深度学习(那么作图 ...

  4. [转]毕设- 深入HBase架构解析(二)

    深入HBase架构解析(二) 前言 这是<深入HBase架构解析(一)>的续,不多废话,继续.... HBase读的实现 通过前文的描述,我们知道在HBase写时,相同Cell(RowKe ...

  5. 【知识必备】RxJava+Retrofit二次封装最佳结合体验,打造懒人封装框架~

    一.写在前面 相信各位看官对retrofit和rxjava已经耳熟能详了,最近一直在学习retrofit+rxjava的各种封装姿势,也结合自己的理解,一步一步的做起来. 骚年,如果你还没有掌握ret ...

  6. 【开源毕设】一款精美的家校互动APP分享——爱吖校推 [你关注的,我们才推](持续开源更新3)附高效动态压缩Bitmap

    一.写在前面 爱吖校推如同它的名字一样,是一款校园类信息推送交流平台,这么多的家校互动类软件,你选择了我,这是我的幸运.从第一次在博客园上写博客到现在,我一次一次地提高博文的质量和代码的可读性,都是为 ...

  7. C#SerialPort如何读取串口数据并显示在TextBox上

    SerialPort中串口数据的读取与写入有较大的不同.由于串口不知道数据何时到达,因此有两种方法可以实现串口数据的读取.一.线程实时读串口:二.事件触发方式实现. 由于线程实时读串口的效率不是十分高 ...

  8. 对比SerialCommunication和微软的SerialPort,向SerialPort看齐

    SerialCommunication是我综合网上看到的代码稍作修改而成的串口通信类,而SerialPort则是C#的System类库的IO目录Ports子目录下的串口通信类.SerialCommun ...

  9. c#实现串口操作 SerialPort

    命名空间:using System.IO.Ports;该类提供了同步 I/O 和事件驱动的 I/O.对管脚和中断状态的访问以及对串行驱动程序属性的访问. 操作类声明: SerialPort sp = ...

随机推荐

  1. uiwebview的常用属性1-故事版

  2. Oracle数据库零散知识02

    15,函数的创建,要求必须有返回值,必须在语句中调用,需要多个返回值时,使用out参数类型,在user_procedures表中查询属性,在user_source表中查询源代码,创建示例: CREAT ...

  3. Java堆/栈/常量池以及String的详细详解(转)------经典易懂系统

    一:在JAVA中,有六个不同的地方可以存储数据: 1. 寄存器(register). 这是最快的存储区,因为它位于不同于其他存储区的地方——处理器内部.但是寄存器的数量极其有限,所以寄存器由编译器根据 ...

  4. [GeekBand] C++ 内存分布—— new和delete重载的实现及分析

    本文参考文献:GeekBand课堂内容,授课老师:侯捷 :深度探索C++对象模型(侯捷译) :网络资料: http://www.leavesite.com/geekband-cpp-5.html ht ...

  5. 【codeforces 787A】The Monster

    [题目链接]:http://codeforces.com/contest/787/problem/A [题意] 把b一直加a->得到x 把d一直加c->得到y 然后问你x和y可不可能有相同 ...

  6. sparksql 用反射的方式将rdd转换成dataset/dataframe

    java public class ReflectionDemo { private static SparkConf conf = new SparkConf().setAppName(" ...

  7. Cordova之如何用命令行创建一个项目(完整示例)

    原文:Cordova之如何用命令行创建一个项目(完整示例) 1. 创建cordova项目 (注意:当第一次创建或编译项目的时候,可能系统会自动下载一些东西,需要一些时间.) 在某个目录下创建cordo ...

  8. javascript 获取上一周的时间

    <script type="text/javascript" language="javascript"> //获取系统时间 var LSTR_nd ...

  9. HSQL一个简短的引论

    前言     在对dao层写測试类的时候,我们须要一个測试数据库,一般我们会是专门建立一个真实的測试数据库,可是有了HSQLDB事情就变得简单了起来. 正题 一.简单介绍: hsql数据库是一款纯Ja ...

  10. override 与overload 的差别

    方法的重写(Overriding)和重载(Overloading)是Java多态性的不同表现.   重写(Overriding)是父类与子类之间多态性的一种表现,而重载(Overloading)是一个 ...