如果,翻看我之前的博客,会找到一篇用I/O模拟IIC通信的程序文章。好吧,如果找不到可以点击这里,这里就不在赘述了,系统也已经完全调试通过了。
今天的任务是,把测试得到的数据在上位机的界面上显示出来,于是键盘手花了两天的时间模仿着巨人的肩膀通过了用C#编写的界面程序,界面很简单就像下面显示的一样。
下面就一步一步给大伙展示一下我的程序吧。
C#非常的强大而且友好,串口的通信可以通过编程环境(这里我用的是Visual%20Studio%202010),如果有需要的话可以给我信息,我有完整版的安装包。如下图,简单的调用和选择就完成了串口的基本配置。
下面主要就是编程的问题了,在窗体Load的进程中可以完成串口的启动
%201%20%20%20%20%20%20%20%20%20PRivate%20void%20Form1_Load(object%20sender,%20EventArgs%20e)%202%20%20%20%20%20%20%20%20%20{%203%20%20%20%20%20%20%20%20%20%20%20%20%20serialPort1.PortName%20=%20"COM4";%204%20%20%20%20%20%20%20%20%20%20%20%20%20serialPort1.BaudRate%20=%209600;%205%20%20%20%20%20%20%20%20%20%20%20%20%20serialPort1.Open();%206%20%20%20%20%20%20%20%20%20%20%20%20%20this.textBox1.Clear();%207%20%20%20%20%20%20%20%20%20%20%20%20%20thread%20=%20new%20Thread(CrossThreadFlush);%208%20%20%20%20%20%20%20%20%20%20%20%20%20thread.IsBackground%20=%20true;%209%20%20%20%20%20%20%20%20%20%20%20%20%20thread.Start();10%20%20%20%20%20%20%20%20%20}
而后就是读取数据的操作,这时候用到事件
1%20private%20void%20serialPort1_DataReceived(object%20sender,%20SerialDataReceivedEventArgs%20e)
在这个事件里面编程就可以了,但是在对窗体内文本进行操作的时候会发现出现了线程的冲突和错误。网上给出的一种解决方法是采用代理的方式具体的程序如下
%20%201%20%20public%20partial%20class%20Form1%20:%20Form%20%202%20%20%20%20%20{%20%203%20%20%20%20%20%20%20%20%20private%20delegate%20void%20FlushClient();%20//代理%20%204%20%20%20%20%20%20%20%20%20Thread%20thread%20=%20null;%20%205%20%20%20%20%20%20%20%20%20uint%20DateTemp;%20%206%20%20%20%20%20%20%20%20%20uint%20Datefalg%20=%200;%20%207%20%20%20%20%20%20%20%20%20uint%20counter%20=%200;%20%208%20%20%20%20%20%20%20%20%20uint%20DateTemp1%20=%200;%20%209%20%20%20%20%20%20%20%20%20uint%20TMP1;%2010%20%20%20%20%20%20%20%20%20uint%20RH1;%2011%20%20%20%20%20%20%20%20%20uint%20PRESS1;%2012%20%20%20%20%20%20%20%20%20double%20TMP;%2013%20%20%20%20%20%20%20%20%20double%20RH;%2014%20%20%20%20%20%20%20%20%20double%20PRESS;%2015%20%2016%20%20%20%20%20%20%20%20%20public%20Form1()%2017%20%20%20%20%20%20%20%20%20{%2018%20%20%20%20%20%20%20%20%20%20%20%20%20InitializeComponent();%2019%20%20%20%20%20%20%20%20%20}%2020%20%2021%20%2022%20%20%20%20%20%20%20%20%20private%20void%20Form1_Load(object%20sender,%20EventArgs%20e)%2023%20%20%20%20%20%20%20%20%20{%2024%20%20%20%20%20%20%20%20%20%20%20%20%20serialPort1.PortName%20=%20"COM4";%2025%20%20%20%20%20%20%20%20%20%20%20%20%20serialPort1.BaudRate%20=%209600;%2026%20%20%20%20%20%20%20%20%20%20%20%20%20serialPort1.Open();%2027%20%20%20%20%20%20%20%20%20%20%20%20%20this.textBox1.Clear();%2028%20%20%20%20%20%20%20%20%20%20%20%20%20thread%20=%20new%20Thread(CrossThreadFlush);%2029%20%20%20%20%20%20%20%20%20%20%20%20%20thread.IsBackground%20=%20true;%2030%20%20%20%20%20%20%20%20%20%20%20%20%20thread.Start();%2031%20%20%20%20%20%20%20%20%20}%2032%20%2033%20%20%20%20%20%20%20%2034%20%20%20%20%20%20%20%20%20private%20void%20serialPort1_DataReceived(object%20sender,%20SerialDataReceivedEventArgs%20e)%2035%20%20%20%20%20%20%20%20%20{%2036%20%20%20%20%20%20%20%20%20%20%20%20%20counter=counter+1;%2037%20%20%20%20%20%20%20%20%20%20%20%20%20DateTemp%20=%20(uint)this.serialPort1.ReadByte();%2038%20%20%20%20%20%20%20%20%20%20%20%20%20if%20(DateTemp%20==%200xF1)%2039%20%20%20%20%20%20%20%20%20%20%20%20%20{%2040%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20Datefalg%20=%201;%2041%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20DateTemp1%20=%200;%2042%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20DateTemp%20=%200;%2043%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20counter=0;%2044%20%20%20%20%20%20%20%20%20%20%20%20%20}%2045%20%20%20%20%20%20%20%20%20%20%20%20%20if%20(DateTemp%20==%200xF2)%2046%20%20%20%20%20%20%20%20%20%20%20%20%20{%2047%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20Datefalg%20=%202;%2048%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20DateTemp1%20=%200;%2049%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20DateTemp%20=%200;%2050%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20counter=0;%2051%20%20%20%20%20%20%20%20%20%20%20%20%20}%2052%20%20%20%20%20%20%20%20%20%20%20%20%20if%20(DateTemp%20==%200xF3)%2053%20%20%20%20%20%20%20%20%20%20%20%20%20{%2054%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20Datefalg%20=%203;%2055%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20DateTemp1%20=%200;%2056%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20DateTemp%20=%200;%2057%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20counter=0;%2058%20%20%20%20%20%20%20%20%20%20%20%20%20}%2059%20%20%20%20%20%20%20%20%20%20%20%20%20if%20(Datefalg%20==%201%20&&%20DateTemp%20!=%200xF1)%2060%20%20%20%20%20%20%20%20%20%20%20%20%20{%20%20%20if(counter==1)%2061%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20DateTemp1%20=%20DateTemp;%2062%20%20%20%20%20%20%20%20%20%20%20%20%20if%20(counter%20==%202)%2063%20%20%20%20%20%20%20%20%20%20%20%20%20{%2064%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20TMP1%20=%20DateTemp1%20*%20256%20+%20DateTemp;%2065%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20TMP%20=%20(0.01%20*%20TMP1)%20-%2040;%2066%20%20%20%20%20%20%20%20%20%20%20%20%20}%2067%20%20%20%20%20%20%20%20%20%20%20%20%20%2068%20%20%20%20%20%20%20%20%20%20%20%20%20}%2069%20%20%20%20%20%20%20%20%20%20%20%20%20if%20(Datefalg%20==%202%20&&%20DateTemp%20!=%200xF2)%2070%20%20%20%20%20%20%20%20%20%20%20%20%20{%2071%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20(counter%20==%201)%2072%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20DateTemp1%20=%20DateTemp;%2073%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20(counter%20==%202)%2074%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20{%2075%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20RH1%20=%20DateTemp1%20*%20256%20+%20DateTemp;%2076%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20RH%20=%20(0.0405%20*%20RH1)%20-%204-0.0000028*RH1*RH1;%2077%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20}%2078%20%2079%20%20%20%20%20%20%20%20%20%20%20%20%20}%2080%20%20%20%20%20%20%20%20%20%20%20%20%20if%20(Datefalg%20==%203%20&&%20DateTemp%20!=%200xF3)%2081%20%20%20%20%20%20%20%20%20%20%20%20%20{%2082%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20(counter%20==%201)%2083%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20DateTemp1%20=%20DateTemp;%2084%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20(counter%20==%202)%2085%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20{%2086%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20PRESS1%20=%20DateTemp1%20*%20256%20+%20DateTemp;%2087%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20PRESS%20=%20(PRESS1-16384)*90/16384%20+%2030;%2088%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20}%2089%20%20%20%20%20%20%20%20%20%20%20%20%20}%2090%20%20%20%20%20%20%20%20%20}%2091%20%2092%20%20%20%20%20%20%20%20%20private%20void%20CrossThreadFlush()%2093%20%20%20%20%20%20%20%20%20{%2094%20%20%20%20%20%20%20%20%20%20%20%20%20while%20(true)%2095%20%20%20%20%20%20%20%20%20%20%20%20%20{%2096%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20//将sleep和无限循环放在等待异步的外面%2097%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20Thread.Sleep(500);%2098%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20ThreadFunction();%2099%20%20%20%20%20%20%20%20%20%20%20%20%20}100%20%20%20%20%20%20%20%20%20}101%20%20%20%20%20102%20%20%20%20%20%20%20%20%20private%20void%20ThreadFunction()103%20%20%20%20%20%20%20%20%20{104%20%20%20%20%20%20%20%20%20%20%20%20%20if%20(this.textBox1.InvokeRequired)//等待异步105%20%20%20%20%20%20%20%20%20%20%20%20%20{106%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20FlushClient%20fc%20=%20new%20FlushClient(ThreadFunction);107%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20this.Invoke(fc);%20//通过代理调用刷新方法108%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20109%20%20%20%20%20%20%20%20%20%20%20%20%20}110%20%20%20%20%20%20%20%20%20%20%20%20%20else111%20%20%20%20%20%20%20%20%20%20%20%20%20textBox1.Text%20=%20TMP.ToString("0.00");112%20%20%20%20%20%20%20%20%20%20%20%20%20if%20(this.textBox2.InvokeRequired)//等待异步113%20%20%20%20%20%20%20%20%20%20%20%20%20{114%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20FlushClient%20fc%20=%20new%20FlushClient(ThreadFunction);115%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20this.Invoke(fc);%20//通过代理调用刷新方法116%20117%20%20%20%20%20%20%20%20%20%20%20%20%20}118%20%20%20%20%20%20%20%20%20%20%20%20%20else119%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20textBox2.Text%20=%20RH.ToString("0.00");120%20%20%20%20%20%20%20%20%20%20%20%20%20if%20(this.textBox3.InvokeRequired)//等待异步121%20%20%20%20%20%20%20%20%20%20%20%20%20{122%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20FlushClient%20fc%20=%20new%20FlushClient(ThreadFunction);123%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20this.Invoke(fc);%20//通过代理调用刷新方法124%20125%20%20%20%20%20%20%20%20%20%20%20%20%20}126%20%20%20%20%20%20%20%20%20%20%20%20%20else127%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20textBox3.Text%20=%20PRESS.ToString("0.00");128%20%20%20%20%20%20%20%20%20%20%20%20%20129%20%20%20%20%20%20%20%20%20}130%20%20%20%20%20%20%20131%20%20%20%20%20%20%20%20%20132%20%20%20%20%20}
通过这样的一番调试之后才得以程序正确的运行,由于工科程序员和计算机程序员的编程思想还是有差别的,所以写的不好的地方请轻喷。
【重要通知】
为了丰富给位程序狗&硬件狗们的业余生活,我们做了一个艰难的决定,我们“泡泡鱼工作室”开通了“硬件为王”公共订阅号,微信号:king_hardware。关注智能硬件和互联网创业,以及日常学习资料/搞笑段子推送。请猛扫下面的二维码!
Powered By Bubble_fish ; Email:bubble_fish@yeah.net
新闻热点
疑难解答