找回密码
 注册
LabVIEW+单片机学习套件全套教程资料下载[免费]LabVIEW论坛精华列表贴USB0816数据采集卡《LabVIEW宝典》
LabWindows/CVI论坛精华贴NET0816以太网数据采集卡RC0210远程设备授权系统 关闭关停锁定打开设备 户外分布式数据采集
NET1624低速高精度以太网数据采集卡WIFI0824SD无线WIFI网络数据采集卡脱机运行 SD存储 小尺寸微型 串口采集远程采集 安卓 手持移动采集 纪录仪
查看: 2663|回复: 13

如何把从串口接收到的字符型数据转换为double型并显示出波形(求救)

[复制链接]
bingliang06 该用户已被删除
发表于 2009-3-5 20:49:15 | 显示全部楼层 |阅读模式
本帖最后由 bingliang06 于 2009-3-7 09:40 编辑

单片机通过串口发给PC机的数据是字符型的,但是我要把字符型数组转换为double型数组,并以double型数组为画图的数据画出相应的波形,但是不知道为什么,发现转换的数据不正确,显示不出波形来,请大家帮我看看那里有问题???本人是初学者,所以请大家对对指教,其中转换部分代码如下:
int CVICALLBACK Receive (int panel, int control, int event,
  void *callbackData, int eventData1, int eventData2)
{

int inputqueuelength;
int bytesread;
char *charmatched=0 ;
double value;
int i;
double valuebuf[2048];
switch (event)
{
  case EVENT_COMMIT:
     //获得指定端口输入队列字符数
               inputqueuelength = GetInQLen (1);
   
                  //读取输入队列中字符串
               bytesread = ComRd (1, buffer, inputqueuelength);
              for (i = 0; i <= bytesread; i ++)
         {
         
          charmatched = buffer+1+i;
                   //将字符串格式数据转化为双精度格式
                      Fmt (&value, "%f<%s", charmatched);
                 //把转换的值一个个存入valuebuf数组中
                   valuebuf=value;
          }   
      
   break;
}
return 0;
}

然后用想用 PlotY(PANEL, PANEL_GRAPH, valuebuf, 2048, VAL_INTEGER, VAL_THIN_LINE, VAL_EMPTY_SQUARE, VAL_SOLID, 1, VAL_RED);   函数画波形,但是发现无论输入多少伏的电压,曲线都是在X轴,根本没变化。发现什么错误请大家帮我改正,这个是课程设计来的,月底要交了,请大家救救小弟了。
发表于 2009-3-5 22:51:10 | 显示全部楼层
将项目传上来。不调试不好找出问题。
回复 顶

使用道具 举报

发表于 2009-3-6 09:59:30 | 显示全部楼层
1、buffer的数据类型是什么?——如果要我猜的话,它应该是char(?)
2、你的单片机中有double型吗?它在下位机中占几个字节?
3、Fmt (&value, "%f<%s", charmatched); 在这里就转换,只能得到错误结果!
4、PlotY(PANEL, PANEL_GRAPH, valuebuf, 2048, VAL_INTEGER, VAL_THIN_LINE, VAL_EMPTY_SQUARE, VAL_SOLID, 1, VAL_RED); 这里编译就通不过:因为valuebuf和VAL_INTEGER类型不匹配!
回复 顶

使用道具 举报

发表于 2009-3-6 10:00:25 | 显示全部楼层
另外,还是把你的源码传上来吧!
这样我看起来比较容易!
回复 顶

使用道具 举报

bingliang06 该用户已被删除
 楼主| 发表于 2009-3-6 18:00:11 | 显示全部楼层
1、buffer的数据类型是什么?——如果要我猜的话,它应该是char(?)
2、你的单片机中有double型吗?它在下位机中占几个字节?
3、Fmt (&value, "%f<%s", charmatched); 在这里就转换,只能得到错误结果!
4、PlotY(PANEL, PANEL_GRAPH, valuebuf, 2048, VAL_INTEGER, VAL_THIN_LINE, VAL_EMPTY_SQUARE, VAL_SOLID, 1, VAL_RED); 这里编译就通不过:因为valuebuf和VAL_INTEGER类型不匹配!
回答: 1.没错,是char型。
       2.没有double型,只是发送八位的二进制数,串口调试软件接收到的是2E 68 98之类的数。
       3.我知道转换的结果是错误的,而且数据错得很离谱,但是就是不知道该怎么样修改,因为是初学者,很多都不会。
       4.那是我写错而已。

#include "toolbox.h"
#include <rs232.h>
#include <formatio.h>
#include <cvirte.h>               
#include <userint.h>
#include "test_win.h"

static int panelHandle;
           int valuebuf[2048];      
           char buffer[2048];
int main (int argc, char *argv[])
{
        if (InitCVIRTE (0, argv, 0) == 0)
                return -1;        /* out of memory */
        if ((panelHandle = LoadPanel (0, "test_win.uir", PANEL)) < 0)
                return -1;
        DisplayPanel (panelHandle);
        RunUserInterface ();
        DiscardPanel (panelHandle);
        return 0;
}


int CVICALLBACK Graph (int panel, int control, int event,
                void *callbackData, int eventData1, int eventData2)
{
        switch (event)
        {
                case EVENT_COMMIT:
                         PlotY (PANEL, PANEL_GRAPH, valuebuf, 2048, VAL_INTEGER, VAL_THIN_LINE, VAL_EMPTY_SQUARE, VAL_SOLID, 1, VAL_RED);
                        break;
        }
        return 0;
}

int CVICALLBACK Receive (int panel, int control, int event,
                void *callbackData, int eventData1, int eventData2)
{
       
        int inputqueuelength;
        int bytesread;

        char *matched=0 ;
        int value;

        int i;
       
       
       
        switch (event)
        {
                case EVENT_COMMIT:
                          //获得指定端口输入队列字符数
                      inputqueuelength = GetInQLen (1);
                 
                  //读取输入队列中字符串
                      bytesread = ComRd (1, buffer, inputqueuelength);
                     for (i = 0; i <=  bytesread; i ++)
                                     {
                                                   
                                                           matched = buffer+1+i;
                                        //将字符串格式数据转化为双精度格式
                                           Fmt (&value, "%d<%s", matched);
                                                       
                                        valuebuf[i]=value;

                                      }   
                                  
               
                       
                        break;
        }
        return 0;
}

/*int CVICALLBACK Clear (int panel, int control, int event,
                void *callbackData, int eventData1, int eventData2)
{
        switch (event)
        {
                case EVENT_COMMIT:
                //        ResetTextBox (PANEL, PANEL_RECEIVETEXT, "\0");
                       
                        break;
        }
        return 0;
}   */

int CVICALLBACK Reset (int panel, int control, int event,
                void *callbackData, int eventData1, int eventData2)
{
        switch (event)
        {
                case EVENT_COMMIT:
                          OpenComConfig (1, "COM1", 9600, 0, 8, 1, 2048, 2048);
                          SetCTSMode (1, LWRS_HWHANDSHAKE_OFF);
                          FlushInQ (1);
                          FlushOutQ (1);
                        break;
        }
        return 0;
}

int CVICALLBACK Quit (int panel, int control, int event,
                void *callbackData, int eventData1, int eventData2)
{
        switch (event)
        {
                case EVENT_COMMIT:
                        CloseCom (1);  
                        QuitUserInterface (0);
                        break;
        }
        return 0;
}
回复 顶

使用道具 举报

bingliang06 该用户已被删除
 楼主| 发表于 2009-3-6 18:05:15 | 显示全部楼层
完整工程如下,是9.0版本的,不知道你们能不能打开?不能的话就看上面的程序了,希望版主和大家帮我的错误改正过来。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
回复 顶

使用道具 举报

发表于 2009-3-9 09:33:03 | 显示全部楼层
串口通讯的核心问题是双方的通讯协议,没有这些,看程序是看不出任何东西的!
比如:“ 2.没有double型,只是发送八位的二进制数,串口调试软件接收到的是2E 68 98之类的数。”——如果你不了解下位机的数据类型,就根本无法解码!例如:有些单片机中的int型只占两个字节,而上位机(32位平台)中int型占4个字节!
所以,你即便将上位机程序发上来也无法看出实际问题!重要的是你的通讯协议!!!
回复 顶

使用道具 举报

bingliang06 该用户已被删除
 楼主| 发表于 2009-3-9 22:49:27 | 显示全部楼层
不明白你说什么,先不管单片机那边吧。如果把串口通信的2和3脚短接,然后发送一些字符再接收后转换为数字显示出来该怎么编程啊。现在就是把缓存中的每个单元的ASII码直接转换为相应的数字。
回复 顶

使用道具 举报

发表于 2009-3-9 23:06:37 | 显示全部楼层
在C中,收到的是CHAR型数据。CHAR型本身可以直接可以显示。如果不行,直接赋给INT或DOUBLE也可行的。
回复 顶

使用道具 举报

发表于 2009-3-10 08:46:55 | 显示全部楼层
无语。。。
你对串口通讯毫无概念!
关于串口通讯的流程我以前在论坛中说过,你先搜索一下!现有个正确概念吧!
回复 顶

使用道具 举报

发表于 2009-3-10 08:47:46 | 显示全部楼层
回复 顶

使用道具 举报

发表于 2009-3-10 20:13:50 | 显示全部楼层
兄弟啊,你上传的文件中怎么没有源码啊?这叫别人怎么看得明白啊!串口通信一定要先弄懂协议,不然你收到的数据,也不知道是什么意思,怎么看得出来是对还是错啊!最好是先在网上下个串口调试的软件,先玩玩,之后再用CVI来写,可能会容易点!
回复 顶

使用道具 举报

发表于 2009-3-31 12:39:57 | 显示全部楼层
非常赞同你的观点,我目前在做PC通过串口监控变频器的东东,串口的基本读写程序其实很易理解,但是你如果不好好理解通讯协议的话,程序就会报出很多莫名其妙的错误。 7# netcreature
回复 顶

使用道具 举报

发表于 2009-3-31 21:44:18 | 显示全部楼层
回复 顶

使用道具 举报

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

本版积分规则

Archiver|手机版|cpubbs论坛. ( 粤ICP备09171248号 )

GMT+8, 2026-9-29 03:03 , Processed in 0.066816 second(s), 13 queries , Gzip On, File On.

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

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