bingliang06 发表于 2009-3-5 20:49:15

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

本帖最后由 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;
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

将项目传上来。不调试不好找出问题。

netcreature 发表于 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类型不匹配!

netcreature 发表于 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;      
           char buffer;
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=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版本的,不知道你们能不能打开?不能的话就看上面的程序了,希望版主和大家帮我的错误改正过来。

netcreature 发表于 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码直接转换为相应的数字。

baby 发表于 2009-3-9 23:06:37

在C中,收到的是CHAR型数据。CHAR型本身可以直接可以显示。如果不行,直接赋给INT或DOUBLE也可行的。

netcreature 发表于 2009-3-10 08:46:55

无语。。。
你对串口通讯毫无概念!
关于串口通讯的流程我以前在论坛中说过,你先搜索一下!现有个正确概念吧!

netcreature 发表于 2009-3-10 08:47:46

另外,你传上来的工程文件是什么?!

hcwz 发表于 2009-3-10 20:13:50

兄弟啊,你上传的文件中怎么没有源码啊?这叫别人怎么看得明白啊!串口通信一定要先弄懂协议,不然你收到的数据,也不知道是什么意思,怎么看得出来是对还是错啊!最好是先在网上下个串口调试的软件,先玩玩,之后再用CVI来写,可能会容易点!

wink3000 发表于 2009-3-31 12:39:57

非常赞同你的观点,我目前在做PC通过串口监控变频器的东东,串口的基本读写程序其实很易理解,但是你如果不好好理解通讯协议的话,程序就会报出很多莫名其妙的错误。 7# netcreature

panheping 发表于 2009-3-31 21:44:18

看晕了~~
看来cvi不好弄
页: [1]
查看完整版本: 如何把从串口接收到的字符型数据转换为double型并显示出波形(求救)