OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 16742|回复: 72

《九轴传感器MPU9150 MPU9155 串口上位机解析包+心电信号解析,附VS2012 C#源代码》

[复制链接]

163

主题

1223

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1461
金钱
1461
注册时间
2014-5-21
在线时间
339 小时
发表于 2015-7-17 16:11:16 | 显示全部楼层 |阅读模式
本帖最后由 cornrn 于 2016-5-3 08:45 编辑

直接上传一个视频和小工具,等功能完善了,公开源码(其实不难,主要细节费事)

SuperCOM 2015.exe

132.5 KB, 下载次数: 2257

SuperCOM使用说明视频.exe

4.05 MB, 下载次数: 1031

superCOM上下位机通信协议.pdf

263.02 KB, 阅读权限: 10, 下载次数: 275

SuperCOM 2015.rar

253.98 KB, 阅读权限: 10, 下载次数: 543

彼高丽者,边夷贱类,不足待以仁义,不可责以常礼。古来以鱼鳖畜之,宜从阔略。若必欲绝其种类,恐兽穷则搏。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

35

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
241
金钱
241
注册时间
2016-1-6
在线时间
33 小时
发表于 2016-3-25 12:06:15 | 显示全部楼层
回复 支持 1 反对 0

使用道具 举报

0

主题

17

帖子

0

精华

新手上路

积分
45
金钱
45
注册时间
2016-10-31
在线时间
8 小时
发表于 2016-11-20 21:11:40 | 显示全部楼层
赞一个啊,这个超级给力。给C#做串口通讯做了充分的例程和讲解。
回复 支持 1 反对 0

使用道具 举报

163

主题

1223

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1461
金钱
1461
注册时间
2014-5-21
在线时间
339 小时
 楼主| 发表于 2015-7-17 16:13:57 | 显示全部楼层
一些截图->


彼高丽者,边夷贱类,不足待以仁义,不可责以常礼。古来以鱼鳖畜之,宜从阔略。若必欲绝其种类,恐兽穷则搏。
回复 支持 反对

使用道具 举报

163

主题

1223

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1461
金钱
1461
注册时间
2014-5-21
在线时间
339 小时
 楼主| 发表于 2015-7-17 16:19:01 | 显示全部楼层
 下面一步本打算用directx或者GDI的,由于不是太熟练而且比MATLAB麻烦。具体MATLAB怎么生成DLL给C#,可以参考《MATLAB® C# ® Book》这本书。PDF版本这里分享一下。

MATLAB+CSharp+book.pdf

2.13 MB, 下载次数: 1018

彼高丽者,边夷贱类,不足待以仁义,不可责以常礼。古来以鱼鳖畜之,宜从阔略。若必欲绝其种类,恐兽穷则搏。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2015-7-17 18:58:54 | 显示全部楼层
不错了,顶楼主。。。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

163

主题

1223

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1461
金钱
1461
注册时间
2014-5-21
在线时间
339 小时
 楼主| 发表于 2015-7-17 22:26:36 | 显示全部楼层
回复【4楼】正点原子:
---------------------------------
四轴飞行器这版块似乎没人,没有更新的动力了,⊙﹏⊙b
彼高丽者,边夷贱类,不足待以仁义,不可责以常礼。古来以鱼鳖畜之,宜从阔略。若必欲绝其种类,恐兽穷则搏。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2015-7-17 23:51:27 | 显示全部楼层
回复【5楼】cornrn:
---------------------------------
慢慢来啊,呵呵
ST这块,我们还不是靠这么多年的积累?
要是大家都搞了,也轮不到你来搞了...

这东西就看你抓不抓机遇了。。。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

头像被屏蔽

65

主题

277

帖子

0

精华

高级会员

Rank: 4

积分
674
金钱
674
注册时间
2013-8-11
在线时间
29 小时
发表于 2015-7-18 19:31:29 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

5

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
101
金钱
101
注册时间
2012-8-22
在线时间
6 小时
发表于 2015-7-19 17:20:08 | 显示全部楼层
楼主这个数据往上位机上发的频率是多少?
回复 支持 反对

使用道具 举报

163

主题

1223

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1461
金钱
1461
注册时间
2014-5-21
在线时间
339 小时
 楼主| 发表于 2015-7-20 12:28:08 | 显示全部楼层
回复【8楼】Still:
---------------------------------
115200,我嫌慢,但是用的蓝牙2.0,试了各种品牌蓝牙模块,包括自己做的,速度超过115200都不是很理想。高速蓝牙4.0不是每个智能手机都支持,所以又要兼容又要速度快,难两全其美
彼高丽者,边夷贱类,不足待以仁义,不可责以常礼。古来以鱼鳖畜之,宜从阔略。若必欲绝其种类,恐兽穷则搏。
回复 支持 反对

使用道具 举报

163

主题

1223

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1461
金钱
1461
注册时间
2014-5-21
在线时间
339 小时
 楼主| 发表于 2015-7-20 12:29:54 | 显示全部楼层
回复【6楼】正点原子:
---------------------------------
闻原子兄一言胜读书十载。 暂停15天旅游去,回来把DLL连接上,整理好上传
彼高丽者,边夷贱类,不足待以仁义,不可责以常礼。古来以鱼鳖畜之,宜从阔略。若必欲绝其种类,恐兽穷则搏。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2015-7-20 23:22:43 | 显示全部楼层
回复【10楼】cornrn:
---------------------------------
谢谢支持
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

163

主题

1223

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1461
金钱
1461
注册时间
2014-5-21
在线时间
339 小时
 楼主| 发表于 2015-8-14 15:48:59 | 显示全部楼层
回复【8楼】Still:
---------------------------------
每秒钟三个包,而包是不定长的,自己定的一个简单包协议、
--------------------------------

这个地方贴出我的源码:

VS2012 C# 编写的SuperCOM 2015®



SuperCOM 2015.rar

253.98 KB, 下载次数: 2363

彼高丽者,边夷贱类,不足待以仁义,不可责以常礼。古来以鱼鳖畜之,宜从阔略。若必欲绝其种类,恐兽穷则搏。
回复 支持 反对

使用道具 举报

6

主题

35

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
421
金钱
421
注册时间
2014-4-1
在线时间
11 小时
发表于 2015-8-14 18:00:19 | 显示全部楼层
很好
回复 支持 反对

使用道具 举报

5

主题

33

帖子

0

精华

初级会员

Rank: 2

积分
84
金钱
84
注册时间
2015-6-11
在线时间
3 小时
发表于 2015-8-17 21:09:09 | 显示全部楼层
赞!!!!!!
回复 支持 反对

使用道具 举报

14

主题

225

帖子

3

精华

高级会员

Rank: 4

积分
623
金钱
623
注册时间
2014-7-8
在线时间
26 小时
发表于 2015-8-25 13:10:36 | 显示全部楼层
回复【5楼】cornrn:
---------------------------------
没时间搞啊。。。好烦。。。现在都在搞水下机器人
回复 支持 反对

使用道具 举报

163

主题

1223

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1461
金钱
1461
注册时间
2014-5-21
在线时间
339 小时
 楼主| 发表于 2015-8-25 13:44:57 | 显示全部楼层
回复【15楼】2013的弹子球:
---------------------------------
你不回复差点忘了更新了,上面上传了第一版源码(vs2012 C#编写),好多地方不合理,主要写之前没有目的,想到哪写到哪。真要写程序,还是先确定框架和流程在写这样没逻辑冗余,不好勿拍砖啊
彼高丽者,边夷贱类,不足待以仁义,不可责以常礼。古来以鱼鳖畜之,宜从阔略。若必欲绝其种类,恐兽穷则搏。
回复 支持 反对

使用道具 举报

163

主题

1223

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1461
金钱
1461
注册时间
2014-5-21
在线时间
339 小时
 楼主| 发表于 2015-8-25 13:50:30 | 显示全部楼层
本帖最后由 cornrn 于 2016-5-3 09:41 编辑

[mw_shl_code=csharp,true][/mw_shl_code][mw_shl_code=objc,true]主要程序部分展示:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO.Ports;
using System.Windows.Forms.DataVisualization.Charting;
using System.Runtime.InteropServices;

namespace Oscilloscope
{
    public partial class DisWaveFrm : Form
    {
        #region 变量定义
        public Int32 recFrameNum = 0, recByteNum = 0, waveRefreshCon = 0; //接收到的数据帧数//接收到的数据字节数//波形刷新计数//波形刷新计数
        public string chartTitles = "心电信号", SeriesName1 = "CH1", SeriesName2 = "CH2", SeriesName3 = "CH3";
        PackClass PackClass = new PackClass();//实例化PackClass的对象
        Global Global = new Global();//实例化Global的对象
        private bool handerListening = false;
        private bool comClosing = false;
        public bool[] tabControl_index = { false, false, false, false, false, false };
        #endregion
        #region 初始化所有窗体和空间
        public DisWaveFrm()
        {
            InitializeComponent();
        }
        #endregion
        #region 串口初始化
        private void buttonSwitch_Click(object sender, EventArgs e)
        {
            try
            {
                if (serialPort1.IsOpen)
                {
                    comClosing = true;//串口关闭动作正在进行
                    while (handerListening) Application.DoEvents();//关闭串口前处理完消息队列中的所有事件
                    serialPort1.Close();
                    if (!serialPort1.IsOpen)
                    {
                        buttonSwitch.Text = "打开串口";
                        labelStatus.ForeColor = Color.Black;
                    }
                }
                else
                {
                    comClosing = false;
                    serialPort1.PortName = comboBoxPort.Text;
                    serialPort1.BaudRate = Convert.ToInt32(comboBoxBaudRate.Text);
                    serialPort1.DataBits = Convert.ToInt32(comboBoxData.Text);
                    switch (comboBoxCheck.Text)
                    {
                        case "None": serialPort1.Parity = System.IO.Ports.Parity.None; break;
                        case "Odd": serialPort1.Parity = System.IO.Ports.Parity.Odd; break;
                        case "Even": serialPort1.Parity = System.IO.Ports.Parity.Even; break;
                        case "Mark": serialPort1.Parity = System.IO.Ports.Parity.Mark; break;
                        case "Space": serialPort1.Parity = System.IO.Ports.Parity.Space; break;
                        default: break;
                    }
                    serialPort1.StopBits = (System.IO.Ports.StopBits)Convert.ToInt32(comboBoxStopBit.Text);
                    try
                    {
                        serialPort1.Open();
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show(ex.Message);//现实异常信息给客户。     
                        serialPort1 = new SerialPort();//捕获到异常信息,创建一个新的comm对象,之前的不能用了。
                    }
                    if (serialPort1.IsOpen)
                    {
                        buttonSwitch.Text = "关闭串口";
                        labelStatus.ForeColor = Color.Red;
                    }
                }
            }
            catch (Exception err)
            {
                MessageBox.Show(err.Message);
            }
        }
        #endregion
        #region 串口接收
        private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
        {
            if (comClosing == true) return; //如果正在关闭,忽略操作,直接返回,尽快的完成串口监听线程的一次循环
            try
            {
                handerListening = true;//设置标记,说明已经开始处理数据,一会儿要使用系统UI的。
                int n = serialPort1.BytesToRead;//先记录下来,避免某种原因,人为的原因,操作几次之间时间长,缓存不一致
                if (n == Global.PackSize)
                {
                    byte[] buf = new byte[n];//声明一个临时数组存储当前来的串口数据  
                    serialPort1.Read(buf, 0, n);//读取串口内部缓冲区数据到buf数组
                    serialPort1.DiscardInBuffer();//清空串口内部缓存
                    recByteNum += n;//接收字节数计数
                    recFrameNum++;//帧计数
                    BitConverter.ToUInt16(buf, 0);
                    #region 帧入包
                    //通过接收到的数据设置PackClass类中的属性值  
                    PackClass.CodeVersion = (ushort)((buf[Global.CodeVersion_Index] << 8) + buf[Global.CodeVersion_Index + 1]);
                    PackClass.Length = (ushort)((buf[Global.Length_Index] << 8) + buf[Global.Length_Index + 1]);
                    PackClass.Crc = (ushort)((buf[Global.Crc_Index] << 8) + buf[Global.Crc_Index + 1]);
                    PackClass.Id = (ushort)((buf[Global.Id_Index] << 8) + buf[Global.Id_Index + 1]);

                    PackClass.EcgDataClass.Type = (ushort)((buf[Global.EcgData_Index] << 8) + buf[Global.EcgData_Index + 1]);
                    PackClass.EcgDataClass.Length = (ushort)((buf[Global.EcgData_Index + 2] << 8) + buf[Global.EcgData_Index + 3]);

                    PackClass.EcgMarkClass.Type = (ushort)((buf[Global.EcgMark_Index] << 8) + buf[Global.EcgMark_Index + 1]);
                    PackClass.EcgMarkClass.Length = (ushort)((buf[Global.EcgMark_Index + 2] << 8) + buf[Global.EcgMark_Index + 3]);
                    PackClass.EcgMarkClass.Value = (ushort)((buf[Global.EcgMark_Index + 4] << 8) + buf[Global.EcgMark_Index + 5]);

                    PackClass.BatDataClass.Type = (ushort)((buf[Global.BatData_Index] << 8) + buf[Global.BatData_Index + 1]);
                    PackClass.BatDataClass.Length = (ushort)((buf[Global.BatData_Index + 2] << 8) + buf[Global.BatData_Index + 3]);
                    PackClass.BatDataClass.Value = (ushort)((buf[Global.BatData_Index + 4] << 8) + buf[Global.BatData_Index + 5]);

                    PackClass.AccDataClass.Type = (ushort)((buf[Global.AccData_Index] << 8) + buf[Global.AccData_Index + 1]);
                    PackClass.AccDataClass.Length = (ushort)((buf[Global.AccData_Index + 2] << 8) + buf[Global.AccData_Index + 3]);

                    PackClass.GyrDataClass.Type = (ushort)((buf[Global.GyrData_Index] << 8) + buf[Global.GyrData_Index + 1]);
                    PackClass.GyrDataClass.Length = (ushort)((buf[Global.GyrData_Index + 2] << 8) + buf[Global.GyrData_Index + 3]);

                    PackClass.MagDataClass.Type = (ushort)((buf[Global.MagData_Index] << 8) + buf[Global.MagData_Index + 1]);
                    PackClass.MagDataClass.Length = (ushort)((buf[Global.MagData_Index + 2] << 8) + buf[Global.MagData_Index + 3]);

                    PackClass.ErrDataClass.Type = (ushort)((buf[Global.ErrData_Index] << 8) + buf[Global.ErrData_Index + 1]);
                    PackClass.ErrDataClass.Length = (ushort)((buf[Global.ErrData_Index + 2] << 8) + buf[Global.ErrData_Index + 3]);

                    for (sbyte i = 0, j = 0; i < Global.EcgSize; i++)//Global.PackSize=96
                    {
                        PackClass.EcgDataClass.LeadiValue = (ushort)((buf[Global.EcgData_Index + 4 + 2 * i] << 8) + buf[Global.EcgData_Index + 5 + 2 * i]);
                        if (i % 3 == 0)
                        {
                            PackClass.AccDataClass.xValue[j] = (short)((buf[Global.AccData_Index + 4 + 2 * j] << 8) + buf[Global.AccData_Index + 5 + 2 * j]);
                            PackClass.AccDataClass.yValue[j] = (short)((buf[Global.AccData_Index + 68 + 2 * j] << 8) + buf[Global.AccData_Index + 69 + 2 * j]);
                            PackClass.AccDataClass.zValue[j] = (short)((buf[Global.AccData_Index + 132 + 2 * j] << 8) + buf[Global.AccData_Index + 133 + 2 * j]);
                            PackClass.GyrDataClass.xValue[j] = (short)((buf[Global.GyrData_Index + 4 + 2 * j] << 8) + buf[Global.GyrData_Index + 5 + 2 * j]);
                            PackClass.GyrDataClass.yValue[j] = (short)((buf[Global.GyrData_Index + 68 + 2 * j] << 8) + buf[Global.GyrData_Index + 69 + 2 * j]);
                            PackClass.GyrDataClass.zValue[j] = (short)((buf[Global.GyrData_Index + 132 + 2 * j] << 8) + buf[Global.GyrData_Index + 133 + 2 * j]);
                            PackClass.MagDataClass.xValue[j] = (short)((buf[Global.MagData_Index + 4 + 2 * j] << 8) + buf[Global.MagData_Index + 5 + 2 * j]);
                            PackClass.MagDataClass.yValue[j] = (short)((buf[Global.MagData_Index + 68 + 2 * j] << 8) + buf[Global.MagData_Index + 69 + 2 * j]);
                            PackClass.MagDataClass.zValue[j] = (short)((buf[Global.MagData_Index + 132 + 2 * j] << 8) + buf[Global.MagData_Index + 133 + 2 * j]);
                            j++;
                        }
                    }
                    #endregion
                    //对接收到的数据进行显示 //对接收到的数据进行示波         
                    this.Invoke((EventHandler)(delegate//因为要访问ui资源,所以需要使用invoke方式同步ui。
                    {
                        labelRecByteCount.Text = Convert.ToString(recByteNum);
                        labelRecFrameCount.Text = Convert.ToString(recFrameNum);
                        label_LeadNum.Text = "单";
                        label_Axis.Text = "九";
                        if (tabControl_index[0] == true) { BuildChartSeries(PackClass, "ECG"); }
                        else if (tabControl_index[1] == true) { BuildChartSeries(PackClass, "ACC"); }
                        else if (tabControl_index[2] == true) { BuildChartSeries(PackClass, "GYR"); }
                        else if (tabControl_index[3] == true) { BuildChartSeries(PackClass, "MAG"); }
                        else if (tabControl_index[4] == true) { DisplayDataInRichTextBox(PackClass); }
                        else if (tabControl_index[5] == true) { ; }
                        else { BuildChartSeries(PackClass, "ECG"); }

                    }));
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
            finally
            {
                handerListening = false;
            }
        }
        #endregion
        #region 创建richTextBox控件中显示帧数据
        public void DisplayDataInRichTextBox(PackClass pack)
        {
            
            richTextBox.AppendText("\r\n帧头->");
            richTextBox.AppendText(string.Format("{0:X4}", pack.CodeVersion) + "  ");
            richTextBox.AppendText(string.Format("{0:X4}", pack.Length) + "  ");
            richTextBox.AppendText(string.Format("{0:X4}", pack.Crc) + "  ");
            richTextBox.AppendText(string.Format("{0:X4}", pack.Id) + "  ");
            richTextBox.AppendText("\r\nECG 数据->");
            richTextBox.AppendText(string.Format("{0:X4}", pack.EcgDataClass.Type) + "  ");
            richTextBox.AppendText(string.Format("{0:X4}", pack.EcgDataClass.Length) + "  ");
            for (int i = 0; i < Global.EcgSize; i++)
            {//int类型数变成16进制后转化成string类型输出,小写将 X->x就好
                if (i % Global.AxisSize == 0) richTextBox.AppendText("\r\n"); //换行显示
                richTextBox.AppendText(string.Format("{0:X4}", pack.EcgDataClass.LeadiValue) + "  ");//显示心电信号
            }
            richTextBox.AppendText("\r\n打标数据->");
            richTextBox.AppendText(string.Format("{0:X4}", pack.EcgMarkClass.Type) + "  ");
            richTextBox.AppendText(string.Format("{0:X4}", pack.EcgMarkClass.Length) + "  ");
            richTextBox.AppendText(string.Format("{0:X4}", pack.EcgMarkClass.Value) + "  ");
            for (int i = 0; i < Global.AxisNum; i++)
            {
                if (i == 0)
                {
                    richTextBox.AppendText("\r\nACC 数据->");
                    richTextBox.AppendText(string.Format("{0:X4}", pack.AccDataClass.Type) + "  ");
                    richTextBox.AppendText(string.Format("{0:X4}", pack.AccDataClass.Length) + "\r\n");
                }
                else if (i == 3)
                {
                    richTextBox.AppendText("\r\nGYR 数据->");
                    richTextBox.AppendText(string.Format("{0:X4}", pack.GyrDataClass.Type) + "  ");
                    richTextBox.AppendText(string.Format("{0:X4}", pack.GyrDataClass.Length) + "\r\n");
                }
                else if (i == 6)
                {
                    richTextBox.AppendText("\r\nMAG 数据->");
                    richTextBox.AppendText(string.Format("{0:X4}", pack.MagDataClass.Type) + "  ");
                    richTextBox.AppendText(string.Format("{0:X4}", pack.MagDataClass.Length) + "\r\n");
                }
                else
                {
                    richTextBox.AppendText("\r\n"); //换行显示
                }
                for (int j = 0; j < Global.AxisSize; j++)
                {
                    switch (i)
                    {
                        case 0: richTextBox.AppendText(string.Format("{0:X4}", pack.AccDataClass.xValue[j]) + "  "); break;//显示9轴信号
                        case 1: richTextBox.AppendText(string.Format("{0:X4}", pack.AccDataClass.yValue[j]) + "  "); break;
                        case 2: richTextBox.AppendText(string.Format("{0:X4}", pack.AccDataClass.zValue[j]) + "  "); break;
                        case 3: richTextBox.AppendText(string.Format("{0:X4}", pack.GyrDataClass.xValue[j]) + "  "); break;
                        case 4: richTextBox.AppendText(string.Format("{0:X4}", pack.GyrDataClass.yValue[j]) + "  "); break;
                        case 5: richTextBox.AppendText(string.Format("{0:X4}", pack.GyrDataClass.zValue[j]) + "  "); break;
                        case 6: richTextBox.AppendText(string.Format("{0:X4}", pack.MagDataClass.xValue[j]) + "  "); break;
                        case 7: richTextBox.AppendText(string.Format("{0:X4}", pack.MagDataClass.yValue[j]) + "  "); break;
                        case 8: richTextBox.AppendText(string.Format("{0:X4}", pack.MagDataClass.zValue[j]) + "  "); break;
                        default: break;
                    }
                }

            }
            richTextBox.AppendText("\r\n电量数据->");
            richTextBox.AppendText(string.Format("{0:X4}", pack.BatDataClass.Type) + "  ");
            richTextBox.AppendText(string.Format("{0:X4}", pack.BatDataClass.Length) + "  ");
            richTextBox.AppendText(string.Format("{0:X4}", pack.BatDataClass.Value) + "  ");

            richTextBox.AppendText("\r\n错误信息->");
            richTextBox.AppendText(string.Format("{0:X4}", pack.ErrDataClass.Type) + "  ");
            richTextBox.AppendText(string.Format("{0:X4}", pack.ErrDataClass.Length) + "  ");
            richTextBox.AppendText(string.Format("{0:X4}", pack.ErrDataClass.Value) + "\r\n");
            //设定光标所在位置
            richTextBox.SelectionStart = richTextBox.TextLength;
            //滚动到当前光标处
            richTextBox.ScrollToCaret();
        }
        #endregion[/mw_shl_code]

SuperCOM 2015.rar

253.98 KB, 下载次数: 1909

彼高丽者,边夷贱类,不足待以仁义,不可责以常礼。古来以鱼鳖畜之,宜从阔略。若必欲绝其种类,恐兽穷则搏。
回复 支持 反对

使用道具 举报

163

主题

1223

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1461
金钱
1461
注册时间
2014-5-21
在线时间
339 小时
 楼主| 发表于 2015-8-25 13:50:50 | 显示全部楼层
本帖最后由 cornrn 于 2016-5-3 09:41 编辑

[mw_shl_code=csharp,true]#region 创建Chart控件中Series并分别示波三通道
        public void BuildChartSeries(PackClass pack, string SignalSource)
        {
            if (waveRefreshCon == 0)
            {
                waveline_init();
            }
            if (string.Equals(SignalSource, "ECG"))
            {
                chart1.ChartAreas["ChartArea1"].AxisY.Maximum = 5000;
                chart1.ChartAreas["ChartArea1"].AxisY.Minimum = 1000;
                for (int i = 0; i < Global.EcgSize; i++)
                {
                    chart1.Series[SeriesName1].Points.AddXY(i + (waveRefreshCon) * Global.EcgSize, pack.EcgDataClass.LeadiValue);
                }
            if (++waveRefreshCon >= 8) waveRefreshCon = 0;//显示ECG8个帧
            }
            else if (string.Equals(SignalSource, "ACC"))
            {
                chart1.ChartAreas["ChartArea1"].AxisY.Maximum = 500;
                chart1.ChartAreas["ChartArea1"].AxisY.Minimum = -500;
                for (int i = 0; i < Global.AxisSize; i++)
                {
                    chart1.Series[SeriesName1].Points.AddXY(i + (waveRefreshCon) * Global.AxisSize, pack.AccDataClass.xValue);
                    chart1.Series[SeriesName2].Points.AddXY(i + (waveRefreshCon) * Global.AxisSize, pack.AccDataClass.yValue);
                    chart1.Series[SeriesName3].Points.AddXY(i + (waveRefreshCon) * Global.AxisSize, pack.AccDataClass.zValue);
                }
                if (++waveRefreshCon == 24) waveRefreshCon = 0;//显示ECG24个帧
            }
            else if (string.Equals(SignalSource, "GYR"))
            {
                chart1.ChartAreas["ChartArea1"].AxisY.Maximum = 5000;
                chart1.ChartAreas["ChartArea1"].AxisY.Minimum = -1000;
                for (int i = 0; i < Global.AxisSize; i++)
                {
                    chart1.Series[SeriesName1].Points.AddXY(i + (waveRefreshCon) * Global.AxisSize, pack.GyrDataClass.xValue);
                    chart1.Series[SeriesName2].Points.AddXY(i + (waveRefreshCon) * Global.AxisSize, pack.GyrDataClass.yValue);
                    chart1.Series[SeriesName3].Points.AddXY(i + (waveRefreshCon) * Global.AxisSize, pack.GyrDataClass.zValue);
                }
                if (++waveRefreshCon == 24) waveRefreshCon = 0;//显示ECG24个帧
            }
            else if (string.Equals(SignalSource, "MAG"))
            {
                chart1.ChartAreas["ChartArea1"].AxisY.Maximum = 500;
                chart1.ChartAreas["ChartArea1"].AxisY.Minimum = -500;
                for (int i = 0; i < Global.AxisSize; i++)
                {
                    chart1.Series[SeriesName1].Points.AddXY(i + (waveRefreshCon) * Global.AxisSize, pack.MagDataClass.xValue);
                    chart1.Series[SeriesName2].Points.AddXY(i + (waveRefreshCon) * Global.AxisSize, pack.MagDataClass.yValue);
                    chart1.Series[SeriesName3].Points.AddXY(i + (waveRefreshCon) * Global.AxisSize, pack.MagDataClass.zValue);
                }
                if (++waveRefreshCon == 24) waveRefreshCon = 0;//显示ECG24个帧
            }
        }
        #endregion
        #region 选项卡切换显示
        private void tabCtree_Selected(object sender, EventArgs e)
        {
            for (int i = 0; i < 6; i++) tabControl_index = false;
            waveRefreshCon = 0;
            switch (tabControl1.SelectedIndex)
            {
                case 0:
                    tabControl_index[0] = true;
                    chartTitles = "心电信号";
                    SeriesName1 = "CH1"; SeriesName2 = "CH2"; SeriesName3 = "CH3";
                    waveline_init();//初始波形线
                    break;
                case 1:
                    tabControl_index[1] = true;
                    chartTitles = "加速度三轴信号";
                    SeriesName1 = "xAxis"; SeriesName2 = "yAxis"; SeriesName3 = "zAxis";
                    waveline_init();//初始波形线
                    break;
                case 2:
                    tabControl_index[2] = true;
                    chartTitles = "角速度三轴信号";
                    SeriesName1 = "xAxis"; SeriesName2 = "yAxis"; SeriesName3 = "zAxis";
                    waveline_init();//初始波形线
                    break;
                case 3:
                    tabControl_index[3] = true;
                    chartTitles = "磁力计三轴信号";
                    SeriesName1 = "xAxis"; SeriesName2 = "yAxis"; SeriesName3 = "zAxis";
                    waveline_init();//初始波形线
                    break;
                case 4:
                    tabControl_index[4] = true;
                    richTextBox.BringToFront();//richTextBox显示在顶端
                    richTextBox.Clear();
                    break;
                case 5:
                    tabControl_index[5] = true;
                    richTextBox.BringToFront();//richTextBox显示在顶端
                    richTextBox.Clear();
                    DisplayWordInRichTextBox();  
                    break;
                default:
                    break;
            }
        }
        #endregion
        #region 清除计数
        private void button_clear_Click(object sender, EventArgs e)
        {
            recByteNum = 0;
            recFrameNum = 0;
            labelRecByteCount.Text = Convert.ToString(0);
            labelRecFrameCount.Text = Convert.ToString(0);
            richTextBox.Clear();
        }
        #endregion
        #region 初始化波形线
        public void waveline_init()
        {
            chart1.Titles.Clear();
            chart1.Titles.Add(chartTitles);
            chart1.Series.Clear();
            chart1.Series.Add(SeriesName1);
            chart1.Series.Add(SeriesName2);
            chart1.Series.Add(SeriesName3);
            chart1.BringToFront();//chart1显示在顶端
            chart1.Series[SeriesName1].ChartType = System.Windows.Forms.DataVisualization.Charting.SeriesChartType.Spline;
            chart1.Series[SeriesName2].ChartType = System.Windows.Forms.DataVisualization.Charting.SeriesChartType.Spline;
            chart1.Series[SeriesName3].ChartType = System.Windows.Forms.DataVisualization.Charting.SeriesChartType.Spline;
        }
        #endregion
        #region 创建richTextBox控件中显示软件说明
        public void DisplayWordInRichTextBox()
        {
            richTextBox.AppendText("\r\n 软件说明:");
            richTextBox.AppendText("\r\n  ");
            richTextBox.AppendText("\r\n 支持TLV2.0协议");
            richTextBox.AppendText("\r\n  ");
            richTextBox.AppendText("\r\n 支持单导联三导联三轴九轴设备");
            richTextBox.AppendText("\r\n  ");
            richTextBox.AppendText("\r\n 网站:http://www.smarthealth-tech.com/ ");
        }
        #endregion
    }
}[/mw_shl_code]
彼高丽者,边夷贱类,不足待以仁义,不可责以常礼。古来以鱼鳖畜之,宜从阔略。若必欲绝其种类,恐兽穷则搏。
回复 支持 反对

使用道具 举报

20

主题

120

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
230
金钱
230
注册时间
2015-6-4
在线时间
5 小时
发表于 2015-8-25 16:31:37 | 显示全部楼层
楼主,真心佩服你会这么多东西!!!
回复 支持 反对

使用道具 举报

163

主题

1223

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1461
金钱
1461
注册时间
2014-5-21
在线时间
339 小时
 楼主| 发表于 2015-8-26 09:09:20 | 显示全部楼层
回复【19楼】张晓斌:
---------------------------------
会的多了然并卵,薪水还是这么低。学一样学精了应该是正道,不过我不懂的都想学学所以电子相关的都懂点都不精哈哈
彼高丽者,边夷贱类,不足待以仁义,不可责以常礼。古来以鱼鳖畜之,宜从阔略。若必欲绝其种类,恐兽穷则搏。
回复 支持 反对

使用道具 举报

163

主题

1223

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1461
金钱
1461
注册时间
2014-5-21
在线时间
339 小时
 楼主| 发表于 2015-8-26 09:13:44 | 显示全部楼层
回复【4楼】正点原子:
---------------------------------
原子兄我这帖子还准备继续更新,可是标题没了,麻烦帮我添加一个标题,我好分享更多。thanks
彼高丽者,边夷贱类,不足待以仁义,不可责以常礼。古来以鱼鳖畜之,宜从阔略。若必欲绝其种类,恐兽穷则搏。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2015-8-27 23:45:53 | 显示全部楼层
回复【21楼】cornrn:
---------------------------------
可以,标题改为什么?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

163

主题

1223

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1461
金钱
1461
注册时间
2014-5-21
在线时间
339 小时
 楼主| 发表于 2015-8-28 14:40:34 | 显示全部楼层
回复【22楼】正点原子:
---------------------------------
因为现在没标题啊
彼高丽者,边夷贱类,不足待以仁义,不可责以常礼。古来以鱼鳖畜之,宜从阔略。若必欲绝其种类,恐兽穷则搏。
回复 支持 反对

使用道具 举报

230

主题

1950

帖子

10

精华

论坛元老

Rank: 8Rank: 8

积分
4562
金钱
4562
注册时间
2010-12-14
在线时间
32 小时
发表于 2015-8-28 14:42:26 | 显示全部楼层
回复【23楼】cornrn:
---------------------------------
可以,标题改为什么?我们帮你加上去
我是开源电子网?网站管理员,对网站有任何问题,请与我联系!QQ:389063473Email:389063473@qq.com
回复 支持 反对

使用道具 举报

163

主题

1223

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1461
金钱
1461
注册时间
2014-5-21
在线时间
339 小时
 楼主| 发表于 2015-8-28 14:45:47 | 显示全部楼层
回复【24楼】Admin:
---------------------------------
《九轴传感器MPU9150 MPU9155 串口上位机解析包+心电信号解析,附VS2012 C#源代码》
彼高丽者,边夷贱类,不足待以仁义,不可责以常礼。古来以鱼鳖畜之,宜从阔略。若必欲绝其种类,恐兽穷则搏。
回复 支持 反对

使用道具 举报

20

主题

120

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
230
金钱
230
注册时间
2015-6-4
在线时间
5 小时
发表于 2015-8-28 23:19:05 | 显示全部楼层
回复【20楼】cornrn:
---------------------------------
我是学通信的,也是想多点电子类的东西,但是苦于没人带,太吃亏了!楼主,你这个串口助手是用VB写的吗?怎么才能快速上手呢?
回复 支持 反对

使用道具 举报

163

主题

1223

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1461
金钱
1461
注册时间
2014-5-21
在线时间
339 小时
 楼主| 发表于 2015-8-31 08:27:03 | 显示全部楼层
回复【26楼】张晓斌:
---------------------------------
没用VB,用的C#写的,VB当时学没怎么用.net,C#比VB个人感觉用舒服点。其实学了.net不管什么语言初级阶段区别不大,高级阶段我也用不到也没时间学那么深,毕竟用于辅助电子设计的
彼高丽者,边夷贱类,不足待以仁义,不可责以常礼。古来以鱼鳖畜之,宜从阔略。若必欲绝其种类,恐兽穷则搏。
回复 支持 反对

使用道具 举报

20

主题

120

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
230
金钱
230
注册时间
2015-6-4
在线时间
5 小时
发表于 2015-8-31 11:18:59 | 显示全部楼层
回复【27楼】cornrn:
---------------------------------
佩服!我还不知道怎么学呢!
回复 支持 反对

使用道具 举报

5

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
68
金钱
68
注册时间
2015-3-13
在线时间
0 小时
发表于 2015-10-22 22:48:59 | 显示全部楼层
mark,正在学c#,慢慢啃楼主的程序。。
回复 支持 反对

使用道具 举报

22

主题

180

帖子

1

精华

高级会员

Rank: 4

积分
616
金钱
616
注册时间
2015-6-29
在线时间
101 小时
发表于 2015-10-23 10:41:58 | 显示全部楼层
这个好,下来参考参考
我是菜鸟
回复 支持 反对

使用道具 举报

5

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
68
金钱
68
注册时间
2015-3-13
在线时间
0 小时
发表于 2015-12-18 22:59:30 | 显示全部楼层
楼主,你的数据接受区是不是要按你的帧格式来发啊?怎么我用串口发字符过去,什么都收不到啊?还有你的压缩文件里没找到通信协议,可以再贴一份吗?
回复 支持 反对

使用道具 举报

4

主题

38

帖子

0

精华

初级会员

Rank: 2

积分
169
金钱
169
注册时间
2015-11-3
在线时间
31 小时
发表于 2015-12-20 10:22:30 | 显示全部楼层
回复【31楼】恰同学少年:
---------------------------------
同求
回复 支持 反对

使用道具 举报

163

主题

1223

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1461
金钱
1461
注册时间
2014-5-21
在线时间
339 小时
 楼主| 发表于 2015-12-20 19:34:30 | 显示全部楼层
回复【31楼】恰同学少年:
---------------------------------
恩有格式,我找一下给你的
彼高丽者,边夷贱类,不足待以仁义,不可责以常礼。古来以鱼鳖畜之,宜从阔略。若必欲绝其种类,恐兽穷则搏。
回复 支持 反对

使用道具 举报

163

主题

1223

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1461
金钱
1461
注册时间
2014-5-21
在线时间
339 小时
 楼主| 发表于 2015-12-20 20:27:51 | 显示全部楼层
回复【32楼】moreStrong:
---------------------------------
如下
彼高丽者,边夷贱类,不足待以仁义,不可责以常礼。古来以鱼鳖畜之,宜从阔略。若必欲绝其种类,恐兽穷则搏。
回复 支持 反对

使用道具 举报

163

主题

1223

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1461
金钱
1461
注册时间
2014-5-21
在线时间
339 小时
 楼主| 发表于 2015-12-20 20:29:48 | 显示全部楼层
本帖最后由 cornrn 于 2016-4-12 14:49 编辑

动态心电系统上位机和下位机通讯协议v2.1.1(20131112).pdf

263.02 KB, 阅读权限: 100, 下载次数: 61

彼高丽者,边夷贱类,不足待以仁义,不可责以常礼。古来以鱼鳖畜之,宜从阔略。若必欲绝其种类,恐兽穷则搏。
回复 支持 反对

使用道具 举报

5

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
68
金钱
68
注册时间
2015-3-13
在线时间
0 小时
发表于 2015-12-22 22:45:49 | 显示全部楼层
6666,谢谢楼主!!!!!!顶!!!
回复 支持 反对

使用道具 举报

74

主题

334

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
436
金钱
436
注册时间
2015-5-28
在线时间
144 小时
发表于 2016-1-6 20:41:30 | 显示全部楼层
赞一个
回复 支持 反对

使用道具 举报

10

主题

146

帖子

0

精华

高级会员

Rank: 4

积分
764
金钱
764
注册时间
2015-12-19
在线时间
99 小时
发表于 2016-2-13 15:58:55 | 显示全部楼层
cornrn 发表于 2015-7-20 12:29
回复【6楼】正点原子:
---------------------------------
闻原子兄一言胜读书十载。&nbsp;暂停15天旅 ...

C#思路很好  谢谢您的分享  
回复 支持 反对

使用道具 举报

10

主题

146

帖子

0

精华

高级会员

Rank: 4

积分
764
金钱
764
注册时间
2015-12-19
在线时间
99 小时
发表于 2016-2-13 16:03:47 | 显示全部楼层
做的很棒   楼主的数据解析做的很好
回复 支持 反对

使用道具 举报

1

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
134
金钱
134
注册时间
2016-3-22
在线时间
29 小时
发表于 2016-3-24 10:10:37 | 显示全部楼层
谢谢您的分享
回复 支持 反对

使用道具 举报

163

主题

1223

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1461
金钱
1461
注册时间
2014-5-21
在线时间
339 小时
 楼主| 发表于 2016-4-12 14:38:21 | 显示全部楼层
[mw_shl_code=applescript,true]《使用System.IO.Ports读取COM口数据》

表1 SerialPort类的常用属性
名  称         说  明
BaseStream      获取 SerialPort 对象的基础 Stream 对象
BaudRate          获取或设置串行波特率
BreakState        获取或设置中断信号状态
BytesToRead    获取接收缓冲区中数据的字节数
BytesToWrite   获取发送缓冲区中数据的字节数
CDHolding        获取端口的载波检测行的状态
CtsHolding       获取“可以发送”行的状态
DataBits           获取或设置每个字节的标准数据位长度
DiscardNull      获取或设置一个值,该值指示 Null 字节在端口和接收缓冲区之间传输时是否被忽略
DsrHolding       获取数据设置就绪 (DSR) 信号的状态
DtrEnable         获取或设置一个值,该值在串行通信过程中启用数据终端就绪 (DTR) 信号
Encoding          获取或设置传输前后文本转换的字节编码
Handshake       获取或设置串行端口数据传输的握手协议
IsOpen             获取一个值,该值指示 SerialPort 对象的打开或关闭状态
NewLine          获取或设置用于解释 ReadLine( )和WriteLine( )方法调用结束的值
Parity               获取或设置奇偶校验检查协议
ParityReplace  获取或设置一个字节,该字节在发生奇偶校验错误时替换数据流中的无效字节
PortName         获取或设置通信端口,包括但不限于所有可用的 COM 端口
ReadBufferSize         获取或设置 SerialPort 输入缓冲区的大小
ReadTimeout            获取或设置读取操作未完成时发生超时之前的毫秒数
ReceivedBytesThreshold          获取或设置 DataReceived 事件发生前内部输入缓冲区中的字节数
RtsEnable                 获取或设置一个值,该值指示在串行通信中是否启用请求发送 (RTS) 信号
StopBits                    获取或设置每个字节的标准停止位数
WriteBufferSize        获取或设置串行端口输出缓冲区的大小
WriteTimeout           获取或设置写入操作未完成时发生超时之前的毫秒数
表2 SerialPort类的常用方法
方 法 名 称  说  明
Close                 关闭端口连接,将 IsOpen 属性设置为False,并释放内部 Stream 对象
Open                 打开一个新的串行端口连接
Read                 从 SerialPort 输入缓冲区中读取
ReadByte          从 SerialPort 输入缓冲区中同步读取一个字节
ReadChar          从 SerialPort 输入缓冲区中同步读取一个字符
ReadLine           一直读取到输入缓冲区中的 NewLine 值
ReadTo              一直读取到输入缓冲区中指定 value 的字符串
Write                 已重载。将数据写入串行端口输出缓冲区
WriteLine          将指定的字符串和 NewLine 值写入输出缓冲区

使用SerialPort类的方法:
方法一:
首先要添加
using System.IO;
using System.IO.Ports;
1...在类的内部定义SerialPort com;
2...打开串口
com = new SerialPort();
com.BaudRate = 115200;
com.PortName = "COM1";
com.DataBits = 8;
com.Open();//打开串口
3...发送数据
Byte[] TxData ={1,2,3,4,5,6,7,8 };
com.Write(TxData, 0, 8);
4...接收数据
4.1使用事件接收
this.com.DataReceived += new System.IO.Ports.SerialDataReceivedEventHandler(this.OnDataReceived);
private void OnDataReceived(object sender, SerialDataReceivedEventArgs e)
4.2使用线程接收
接收数据启动一个线程,使其接收。
在类的内部定义
Thread _readThread;
bool _keepReading;
打开串口后启动线程
_keepReading = true;
_readThread = new Thread(ReadPort);
_readThread.Start();
//线程函数
private void ReadPort()
{
while (_keepReading)
{
if (com.IsOpen)
{
byte[] readBuffer = new byte[com.ReadBufferSize + 1];
try
{
// If there are bytes available on the serial port,
// Read returns up to "count" bytes, but will not block (wait)
// for the remaining bytes. If there are no bytes available
// on the serial port, Read will block until at least one byte
// is available on the port, up until the ReadTimeout milliseconds
// have elapsed, at which time a TimeoutException will be thrown.
int count = com.Read(readBuffer, 0, com.ReadBufferSize);
String SerialIn = System.Text.Encoding.ASCII.GetString(readBuffer, 0, count);
if (count != 0)
//byteToHexStr(readBuffer);
ThreadFunction(byteToHexStr(readBuffer,count));
}
catch (TimeoutException) { }
}
else
{
TimeSpan waitTime = new TimeSpan(0, 0, 0, 0, 50);
Thread.Sleep(waitTime);
}
}
}
public void ThreadFunction(string sRecv)
{
//处理数据。。。。
}
方法二:使用C#自带的SerialPor控件。
1...在“工具箱”的“组件”中选择SerialPor控件添加。
2...设置串口并打开
serialPort1.PortName = "COM1";
serialPort1.BaudRate = 9600;
serialPort1.Open();
3...写入数据可以使用Write或者下面的函数
serialPort1.WriteLine(str);
4...添加数据接收的事件
private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
使用中的一些常见问题
C#中SerialPort类中DataReceived事件GUI实时处理方法(来自wanglei_wan@yahoo.com.cn 的看法)
MSDN: 从 SerialPort 对象接收数据时,将在辅助线程上引发 DataReceived 事件。由于此事件在辅助线程而非主线程上引发,因此尝试修改主线程中的一些元素(如 UI 元素)时会引发线程异常。如果有必要修改主 Form 或 Control 中的元素,必须使用 Invoke 回发更改请求,这将在正确的线程上执行.进而要想将辅助线程中所读到的数据显示到主线程的Form控件上时,只有通过Invoke方法来实现
下面是代码实例:
private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
int SDateTemp = this.serialPort1.ReadByte();
//读取串口中一个字节的数据
this.tB_ReceiveDate.Invoke(
//在拥有此控件的基础窗口句柄的线程上执行委托Invoke(Delegate)
//即在textBox_ReceiveDate控件的父窗口form中执行委托.
new MethodInvoker(
/*表示一个委托,该委托可执行托管代码中声明为 void 且不接受任何参数的任何方法。 在对控件的 Invoke 方法进行调用时或需要一个简单委托又不想自己定义时可以使用该委托。*/
delegate{
/* 匿名方法,C#2.0的新功能,这是一种允许程序员将一段完整代码区块当成参数传递的程序代码编写技术,通过此种方法可 以直接使用委托来设计事件响应 程序以下就是你要在主线程上实现的功能但是有一点要注意,这里不适宜处理过多的方法,因为C#消息机制是消息流水线响应机制,如果这里在主线程上处理语句 的时间过长会导致主UI线程阻塞,停止响应或响应不顺畅,这时你的主form界面会延迟或卡死 */
this.tB_ReceiveDate.AppendText(SDateTemp.ToString());//输出到主窗口文本控件
this.tB_ReceiveDate.Text += " ";}
)
);
}
private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e) { int SDateTemp = this.serialPort1.ReadByte(); //读取串口中一个字节的数据 this.tB_ReceiveDate.Invoke( //在拥有此控件的基础窗口句柄的线程上执行委托Invoke(Delegate) //即在textBox_ReceiveDate控件的父窗口form中执行委托. new MethodInvoker( /*表示一个委托,该委托可执行托管代码中声明为 void 且不接受任何参数的任何方法。 在对控件的 Invoke 方法进行调用时或需要一个简单委托又不想自己定义时可以使用该委托。*/ delegate{ /*匿名方法,C#2.0的新功能,这是一种允许程序员将一段完整代码区块当成参数传递的程序代码编写技术,通过此种方法可 以直接使用委托来设计事件响应程序以下就是你要在主线程上实现的功能但是有一点要注意,这里不适宜处理过多的方法,因为C#消息机制是消息流水线响应机 制,如果这里在主线程上处理语句的时间过长会导致主UI线程阻塞,停止响应或响应不顺畅,这时你的主form界面会延迟或卡死 */ this.tB_ReceiveDate.AppendText(SDateTemp.ToString());//输出到主窗口文本控件 this.tB_ReceiveDate.Text += " ";} ) ); }
如何知道当前电脑有哪个串口
在窗体上添加一个comboBox控件。
然后使用comboBox1.Items.AddRange(System.IO.Ports.SerialPort.GetPortNames()); 或者
string[] portList = System.IO.Ports.SerialPort.GetPortNames();
for (int i = 0; i < portList.Length; ++i)
{
string name = portList;
comboBox1.Items.Add(name);
}

SerialPort中串口数据的读取与写入有较大的不同。由于串口不知道数据何时到达,因此有两种方法可以实现串口数据的读取。一、线程实时读串口;二、事件触发方式实现。
由 于线程实时读串口的效率不是十分高效,因此比较好的方法是事件触发的方式。在SerialPort类中有DataReceived事件,当串口的读缓存有 数据到达时则触发DataReceived事件,其中SerialPort.ReceivedBytesThreshold属性决定了当串口读缓存中数据 多少个时才触发DataReceived事件,默认为1。
另外,SerialPort.DataReceived事件运行比较特殊,其运行在辅线程,不能与主线程中的显示数据控件直接进行数据传输,必须用间接的方式实现。如下:

SerialPort spSend; //spSend,spReceive用虚拟串口连接,它们之间可以相互传输数据。spSend发送数据
SerialPort spReceive; //spReceive接受数据
TextBox txtSend; //发送区
TextBox txtReceive; //接受区
Button btnSend; //数据发送按钮
delegate void HandleInterfaceUpdateDelegate(string text); //委托,此为重点
HandleInterfaceUpdateDelegate interfaceUpdateHandle;

public void InitClient() //窗体控件已在初始化
{
interfaceUpdateHandle = new HandleInterfaceUpdateDelegate(UpdateTextBox); //实例化委托对象
spSend.Open(); //SerialPort对象在程序结束前必须关闭,在此说明
spReceive.DataReceived += Ports.SerialDataReceivedEventHandler(spReceive_DataReceived);
spReceive.ReceivedBytesThreshold = 1;
spReceive.Open();
}

public void btnSend_Click(object sender,EventArgs e)
{
spSend.WriteLine(txtSend.Text);
}

public void spReceive_DataReceived(object sender,Ports.SerialDataReceivedEventArgs e)
{
byte[] readBuffer = new byte[spReceive.ReadBufferSize];
spReceive.Read(readBuffer, 0, readBuffer.Length);
this.Invoke(interfaceUpdateHandle, new string[] { Encoding.Unicode.GetString(readBuffer) });
}

private void UpdateTextBox(string text)
{
txtReceive.Text = text;
}

private string StringToHexString(string s,Encoding encode)
        {
            byte[] b = encode.GetBytes(s);//按照指定编码将string编程字节数组
            string result = string.Empty;
            for (int i = 0; i < b.Length; i++)//逐字节变为16进制字符,以%隔开
            {
                result += "%"+Convert.ToString(b, 16);
            }
            return result;
        }
        private string HexStringToString(string hs, Encoding encode)
        {
            //以%分割字符串,并去掉空字符
            string[] chars = hs.Split(new char[]{'%'},StringSplitOptions.RemoveEmptyEntries);
            byte[] b = new byte[chars.Length];
            //逐个字符变为16进制字节数据
            for (int i = 0; i < chars.Length; i++)
            {
                b = Convert.ToByte(chars, 16);
            }
            //按照指定编码将字节数组变为字符串
            return encode.GetString(b);
        }[/mw_shl_code]
彼高丽者,边夷贱类,不足待以仁义,不可责以常礼。古来以鱼鳖畜之,宜从阔略。若必欲绝其种类,恐兽穷则搏。
回复 支持 反对

使用道具 举报

0

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
122
金钱
122
注册时间
2015-5-26
在线时间
20 小时
发表于 2016-4-25 14:21:03 | 显示全部楼层
感谢楼主分享
回复 支持 反对

使用道具 举报

0

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
122
金钱
122
注册时间
2015-5-26
在线时间
20 小时
发表于 2016-4-27 17:33:39 | 显示全部楼层
感谢楼主的分享,辛苦
回复 支持 反对

使用道具 举报

0

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
122
金钱
122
注册时间
2015-5-26
在线时间
20 小时
发表于 2016-4-27 17:35:22 | 显示全部楼层
阅读权限100的楼主能否行个方便,新人看不了,辛苦辛苦
回复 支持 反对

使用道具 举报

163

主题

1223

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1461
金钱
1461
注册时间
2014-5-21
在线时间
339 小时
 楼主| 发表于 2016-4-28 08:38:47 | 显示全部楼层
xiaomao1490 发表于 2016-4-27 17:35
阅读权限100的楼主能否行个方便,新人看不了,辛苦辛苦

好的。。。。
彼高丽者,边夷贱类,不足待以仁义,不可责以常礼。古来以鱼鳖畜之,宜从阔略。若必欲绝其种类,恐兽穷则搏。
回复 支持 反对

使用道具 举报

0

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
122
金钱
122
注册时间
2015-5-26
在线时间
20 小时
发表于 2016-4-29 13:27:23 | 显示全部楼层

十分感谢,楼主辛苦
回复 支持 反对

使用道具 举报

0

主题

3

帖子

0

精华

新手入门

积分
19
金钱
19
注册时间
2016-4-29
在线时间
3 小时
发表于 2016-5-1 01:44:49 | 显示全部楼层
怎么 你的上下位机通信协议下载不了啊
我的邮箱能请你发一下吗。。916939772@qq.com 谢谢了
回复 支持 反对

使用道具 举报

0

主题

3

帖子

0

精华

新手入门

积分
19
金钱
19
注册时间
2016-4-29
在线时间
3 小时
发表于 2016-5-1 10:13:47 | 显示全部楼层
楼主我怎么  下载 不了通信协议权限不够能给我发一下吗  我会很感激你的916939772@qq.com
回复 支持 反对

使用道具 举报

163

主题

1223

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1461
金钱
1461
注册时间
2014-5-21
在线时间
339 小时
 楼主| 发表于 2016-5-3 08:45:51 | 显示全部楼层
element 发表于 2016-5-1 10:13
楼主我怎么  下载 不了通信协议权限不够能给我发一下吗  我会很感激你的

现在去下,没权限限制了
彼高丽者,边夷贱类,不足待以仁义,不可责以常礼。古来以鱼鳖畜之,宜从阔略。若必欲绝其种类,恐兽穷则搏。
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-22 16:31

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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