| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1243 人关注过本帖
标题:一个模仿示波器的串口通讯程序的思路,代码和问题,请大家多指教。
只看楼主 加入收藏
mozhaodi
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2009-1-6
结帖率:100%
收藏
 问题点数:0 回复次数:0 
一个模仿示波器的串口通讯程序的思路,代码和问题,请大家多指教。
这是一个上位机程序,接受来自单片机的16位数据。然后将数据波形显示出来并存储。下位机以数据包的形式将数据发过来,一个数据包有208个字节,
以0x55 0xAA OxAA 0x55这4字节为数据包的头,发送的频率是100ms,胸部信号数据为第14个到54个字节,腿部信号数据为从第55个到第95个字节,程序就是从这数据包里将这80个字节提取出来,2个字节一结合,换成数,然后画出来。接受数据用的是serialport的,dataReceived事件,触发事件的字节数是208个,事件结束后清空缓冲区。画图用的是野比的波形图控件,存储写了一个writefile函数。以下是主要代码  
using System;
using System.Collections.Generic;
using
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Threading;
using System.Timers;
using
using System.Runtime.InteropServices;
using
namespace test
{
    public partial class Form1 : Form
    {
        int[] cd = new int[20];//胸部的值
        int[] ld = new int[20];//腿部的值
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            serialPort1.PortName = "com1";//设定串口号
            serialPort1.open();
        
         }
                                                                                                                                                     private void serialPort1_DataReceived(object sender, e)//事件
        {     byte[] data=new byte[208];
              for (int i = 0; i < 208; i++)
            {
                data[i] = Convert.ToByte(serialPort1.ReadByte());
             }
        if (data[0] == 0x55 && data[1] == 0xAA&&data[2]==0xAA&&data[3]==0x55)//检验包头是否正确
        {
           int[] data2 = new int[40];//提取有效数据
           int[] data3 = new int[40];
           for (int i = 14; i < 54; i++)
                {
                    data2[i - 14] = data[i];


                }
                for (int i = 54; i < 94; i++)
                {
                    data3[i - 54] = data[i];

                }
            for (int i = 0; i < 20; i++)//40个字节,20个数据
           {
            cd[i] = (data2[2 * i] * 256 + data2[2 * i + 1]);
            ld[i] = (data3[2 * i] * 256 + data3[2 * i + 1]);
            statusChart1.Value = cd[i];//画图
            statusChart2.Value = ld[i];
            }
else
{
messagebox.show("丢包了");

}
serialPort1.DiscardInBuffer();//清空串口缓冲区

}
程序写完了但是问题很多。
1.显示丢包提示,但是没有明显丢包的现象。
2.设了一个label,label.text=serialPort1.BytesToRead,发现大于208字节,所以感觉串口没有清空。
3.程序运行一段时间后会变卡,也就是画图变慢,但是关掉重启,就重新恢复顺畅。
4.如果不做检验,程序会流畅多,但是经过一分钟后,会出现明显的丢包现象,就是波形出现空白段。


                             

[ 本帖最后由 mozhaodi 于 2009-9-10 11:54 编辑 ]
搜索更多相关主题的帖子: 思路 通讯 串口 示波器 
2009-09-10 11:50
快速回复:一个模仿示波器的串口通讯程序的思路,代码和问题,请大家多指教。
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.016098 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved