找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 8892|回复: 7
打印 上一主题 下一主题
收起左侧

单片机串口通讯收发数据C#上位机界面显示出来

  [复制链接]
跳转到指定楼层
楼主
ID:540742 发表于 2019-5-17 15:35 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
如果,翻看我之前的博客,会找到一篇用I/O模拟IIC通信的程序文章。好吧,如果找不到可以点击这里,这里就不在赘述了,系统也已经完全调试通过了。
今天的任务是,把测试得到的数据在上位机的界面上显示出来,于是键盘手花了两天的时间模仿着巨人的肩膀通过了用C#编写的界面程序,界面很简单就像下面显示的一样。
下面就一步一步给大伙展示一下我的程序吧。
C#非常的强大而且友好,串口的通信可以通过编程环境(这里我用的是Visual Studio 2010),如果有需要的话可以给我信息,我有完整版的安装包。如下图,简单的调用和选择就完成了串口的基本配置。
下面主要就是编程的问题了,在窗体Load的进程中可以完成串口的启动

而后就是读取数据的操作,这时候用到事件
1 private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
在这个事件里面编程就可以了,但是在对窗体内文本进行操作的时候会发现出现了线程的冲突和错误。网上给出的一种解决方法是采用代理的方式具体的程序如下:
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Threading.Tasks;
  9. using System.Windows.Forms;
  10. using System.IO.Ports;
  11. using System.Net.Http;
  12. using System.Collections;

  13. namespace SerialPortDataUploader
  14. {
  15.     public partial class Form1 : Form
  16.     {
  17.         public Form1()
  18.         {
  19.             InitializeComponent();
  20.         }

  21.         private void comboBoxSerialPort_SelectedIndexChanged(object sender, EventArgs e)
  22.         {
  23.             serialPort1.PortName = comboBoxSerialPort.Items[comboBoxSerialPort.SelectedIndex].ToString();
  24.         }

  25.         private void comboBoxSerialPort_MouseClick(object sender, MouseEventArgs e)
  26.         {
  27.             comboBoxSerialPort.Items.Clear();
  28.             comboBoxSerialPort.Items.AddRange(SerialPort.GetPortNames());
  29.         }

  30.         private void listBoxLog_SelectedIndexChanged(object sender, EventArgs e)
  31.         {
  32.             if (listBoxLog.SelectedItem != null)
  33.                 textBoxLog.Text = listBoxLog.SelectedItem.ToString();
  34.         }

  35.         Queue<char> DataQueue = new Queue<char>();
  36.         volatile private int lightZ = 50, tempZ = 28, wetZ = 30;
  37.         volatile private int lightX = 50, tempX = 28, wetX = 30;
  38.         volatile private int lightL = 50, tempL = 28, wetL = 30;

  39.         private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
  40.         {
  41.             char[] tmp = new char[1000];
  42.             int count = serialPort1.BytesToRead;
  43.             serialPort1.Read(tmp, 0, count);
  44.             for (int i = 0; i < count; i++)
  45.                 DataQueue.Enqueue(tmp[i]);

  46.             while (DataQueue.Count >= 11)
  47.             {
  48.                 switch (DataQueue.Peek())
  49.                 {
  50.                     case 'z':
  51.                     case 'l':
  52.                     case 'x':
  53.                         {
  54.                             char[] tmp1 = new char[100];
  55.                             for (int i = 0; i < 11; i++)
  56.                                 tmp1[i] = DataQueue.Dequeue();
  57.                             try
  58.                             {
  59.                                 int light = (tmp1[2] - 0x30) * 10 + (tmp1[3] - 0x30);
  60.                                 int temp = (tmp1[5] - 0x30) * 10 + (tmp1[6] - 0x30);
  61.                                 int wet = (tmp1[8] - 0x30) * 10 + (tmp1[9] - 0x30);
  62.                                 switch (tmp1[0])
  63.                                 {
  64.                                     case 'z': lightZ = light; tempZ = temp; wetZ = wet; break;
  65.                                     case 'x': lightX = light; tempX = temp; wetX = wet; break;
  66.                                     case 'l': lightL = light; tempL = temp; wetL = wet; break;
  67.                                 }
  68.                             }
  69.                             catch (Exception) { }
  70.                             break;
  71.                         }
  72.                     default:
  73.                         DataQueue.Dequeue();
  74.                         break;
  75.                 }
  76.             }
  77.         }

  78.         private void Form1_Load(object sender, EventArgs e)
  79.         {
  80.             comboBoxSerialPort.Items.Clear();
  81.             comboBoxSerialPort.Items.AddRange(SerialPort.GetPortNames());
  82.         }

  83.         private void buttonConnect_Click(object sender, EventArgs e)
  84.         {
  85.             serialPort1.Open();
  86.             buttonConnect.Enabled = false;
  87.             comboBoxSerialPort.Enabled = false;
  88.             labelStatu.ForeColor = Color.Green;
  89.             timer1.Start();
  90.         }
  91.         private string HTTPGet(string url)
  92.         {
  93.             using (var client = new HttpClient())
  94.             {
  95.                 var responseString = client.GetStringAsync(url);
  96.                 return responseString.Result;
  97.             }
  98.         }
  99.         private async Task<string> HTTPPost(string url, Dictionary<string, string> values)
  100.         {
  101.             using (var client = new HttpClient())
  102.             {
  103.                 var content = new FormUrlEncodedContent(values);

  104.                 var response = await client.PostAsync(url, content);

  105.                 var responseString = await response.Content.ReadAsStringAsync();
  106.                 return responseString.ToString();
  107.             }
  108.         }

  109.         delegate void listBoxLogAddMessage_Callback(string mwssage);
  110.         private void listBoxLogAddMessage(string message)
  111.         {
  112.             if (listBoxLog.InvokeRequired)
  113.             {
  114.                 listBoxLogAddMessage_Callback d = new listBoxLogAddMessage_Callback(listBoxLogAddMessage);
  115.                 this.Invoke(d, new object[] { message });
  116.             }
  117.             else
  118.             {
  119.                 listBoxLog.Items.Add(message);
  120.                 listBoxLog.SelectedIndex = listBoxLog.Items.Count - 1;
  121.             }
  122.         }

  123.         bool Timer1Flag = false;
  124.         int timer = 0, TimeSet = 5;
  125.         private void timer1_Tick(object sender, EventArgs e)
  126.         {
  127.             timer++;
  128.             if (Timer1Flag)
  129.                 return;
  130.             string tmp = HTTPGet(BaseURL + "API.aspx?api=contralget1");
  131.             try
  132.             {
  133.                 TimeSet = int.Parse(tmp);
  134.             }
  135.             catch (Exception) { }
  136.             if (TimeSet > 0 && timer >= TimeSet)
  137.             {
  138.                 timer -= TimeSet;
  139.                 Timer1Flag = true;
  140.                 try
  141.                 {
  142.                     string url = BaseURL + "API.aspx?api=upload&lightZ={LIGHTZ}&lightX={LIGHTX}&lightL={LIGHTL}&tempZ={TEMPZ}&tempX={TEMPX}&tempL={TEMPL}&wetZ={WETZ}&wetX={WETX}&wetL={WETL}".Replace("{LIGHTZ}", lightZ.ToString()).Replace("{LIGHTX}", lightX.ToString());
  143.                     url = url.Replace("{LIGHTL}", lightL.ToString()).Replace("{TEMPZ}", tempZ.ToString()).Replace("{TEMPX}", tempX.ToString()).Replace("{TEMPL}", tempL.ToString()).Replace("{WETZ}", wetZ.ToString()).Replace("{WETX}", wetX.ToString()).Replace("{WETL}", wetL.ToString());

  144.                     string message = HTTPGet(url);
  145.                     if (!message.Equals("{\"statu\":\"ok\"}"))
  146.                         listBoxLogAddMessage(DateTime.Now.ToString() + "  服务器返回异常:" + message);
  147.                     else
  148.                         listBoxLogAddMessage(DateTime.Now.ToString() + "  已上传至服务器。");
  149.                 }
  150.                 catch (Exception ext)
  151.                 {
  152.                     listBoxLogAddMessage(DateTime.Now.ToString() + "  上传至服务器失败:" + ext.Message);
  153.                 }
  154.                 Timer1Flag = false;
  155.             }
  156.         }
  157.     }
  158. }
复制代码
全部资料51hei下载地址:
EngineeringPractice20171_ServerAndUploader-master.zip (28.48 KB, 下载次数: 243)

评分

参与人数 2黑币 +55 收起 理由
酱大锤 + 5 赞一个!
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏9 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:440747 发表于 2019-5-31 17:15 | 只看该作者
谢谢分享 好资料,51黑有你更精彩!!!
回复

使用道具 举报

板凳
ID:540397 发表于 2019-7-24 09:39 | 只看该作者
不错
回复

使用道具 举报

地板
ID:642557 发表于 2019-11-15 13:05 | 只看该作者
谢谢分享
回复

使用道具 举报

5#
ID:916468 发表于 2021-5-6 16:58 | 只看该作者
楼主可以发一下安装包给大家吗?
回复

使用道具 举报

6#
ID:731836 发表于 2023-8-1 18:25 | 只看该作者
下载的文件和展示的文件是2个不同的,各位要下载的注意下,不是上面文档介绍的温湿度!!!
回复

使用道具 举报

7#
ID:1075678 发表于 2023-11-14 21:39 | 只看该作者
感谢楼主分享,最近要做项目刚好要学习使用
回复

使用道具 举报

8#
ID:353115 发表于 2023-11-27 09:16 | 只看该作者
爱学习的小菜 发表于 2023-11-14 21:39
感谢楼主分享,最近要做项目刚好要学习使用

STC-ISP软件有将数据接收到文件的功能,你可以试一下。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表