笨笨熊ll 发表于 2013-5-13 22:44:52

TQ6410与ZigBee传输数据的问题

    我用一根串口线将ZigBee和6410的开发板进行连接,通过调用串口ttyUSB0将ZigBee收集到的数据通过串口线,将数据传输到开发板的上,显示数据并将这些数据进行入库(用的是sqlite)保存,我将程序烧到开发板上运行,接收到的数据是错的,能入库就是数据不对。后面我将通过开发板上自带的串口小助手显示数据上面显示的数据是对的。我现在不知道如何修改我的程序,请高人指点一下!附件中有我的代码!而且我发现只要串口小助手显示数据,我的程序在开发板上运行现实的数据就是0,小助手调用的串口也是ttyUSB0,是不是占用同一个串口,从而导致竞争,但是我在程序中主要是通过缓冲寄存器buffer将数据暂时存储在寄存器里面,应该不存在占用串口这个问题。




TQ-lkp 发表于 2013-5-14 09:11:53

1、波特率
2、字符处理的方法
尽量不要以附件的形式,一般是不会看的,直接贴代码

笨笨熊ll 发表于 2013-5-14 15:26:15

TQ-lkp 发表于 2013-5-14 09:11 static/image/common/back.gif
1、波特率
2、字符处理的方法
尽量不要以附件的形式,一般是不会看的,直接贴代码

//该程序实现的功能:将ZigBee收集到的数据送库,进行于特定值的比对.

#include "stdio.h"
#include "sys/types.h"
#include "sys/ioctl.h"
#include "stdlib.h"
#include "termios.h"
#include "sys/stat.h"
#include "fcntl.h"
#include "sys/time.h"
#include "sqlite3.h"
#include "string.h"


#define BUF_LEN 256
#define N 10
#define IOCTL_RELAY_OFF   0
#define IOCTL_RELAY_ON      1


int main (void)
{
        int i=0;
        int fd;
        unsigned char buf;
        unsigned short Temp = 0;
        int flag = 0;
        sqlite3 * db = NULL;
        char *zErrMsg = 0;
        int rc;
        float a;
        float *p;
        int c=0;
        int ret,j;
        unsigned int value_t=0;
    unsigned int value_h=0;
    float fvalue_t,fvalue_h;
        unsigned char elec_coupler;
        double result=0;
       
        //数据库的链接:
    rc = sqlite3_open ("Ds18b20_data.db", &db);//打开一个名为Ds18b20_data的数据库,没有该数据库则新建这个库
        if (rc != SQLITE_OK)
    {
                fprintf (stderr, "Can't open database: %s\n", sqlite3_errmsg (db));
                sqlite3_close (db);//关闭数据库
                exit (1);
        }
        else
        {
            printf("You have opened a sqlite3 database named Ds18b20_data.db successfully\n");
                  char sql = { 0 };
                sprintf (sql, "CREATE TABLE Temp_data(id integer PRIMARY KEY autoincrement,Temp double,Humi double,TIME varchar(20));");//创建一个表名为Temp_data
                sqlite3_exec (db, sql, 0, 0, &zErrMsg);

        #ifdef _DEBUG_ //如果前面已经定义了_DEBUG_ ,则输出所创建的表存在的信息
            printf ("%s\n", zErrMsg);
        #endif
       
        //打开Ds18b20端口       
        if ((fd = open ("/dev/ttyUSB0", O_RDWR | O_NDELAY | O_NOCTTY)) < 0)//open函数用来打开一个设备fd
            {
                        printf ("Open Device Ds18b20 failed.\r\n");
                        exit (1);
                }
        else
    {
                        printf ("Open Device Ds18b20 successed.\r\n");
               
        while (1)
                {
                       
                        //将温度数据读入到寄存器中,并送入到数据库中
                        fvalue_t=0.0,fvalue_h=0.0;value_t=0;value_h=0;
                        ret=read(fd,buf,1);
                        printf ("read data is 0x%02X-0x%02X\n",buf, buf);
                        Temp = ((unsigned short) buf) << 8;
                        Temp |= (unsigned short) buf;
                        printf ("no error here\n");
                        result = 0.0625 * ((double) Temp);
                        printf ("read data is 0x%02X-0x%02X\n",buf, buf);
                        printf ("no error here\n");
            if(ret<0)
                                {
                                        printf("read err!\n");
                                        continue;
                                }   
            sleep(1);
                       
                        //显示数据存入的当前时间
                        struct tm *local;
                        time_t t=time(0);
                        t=time(NULL);
                        local=localtime(&t);
                        char s ;
                        strftime(s,sizeof(s),"%Y-%m-%d %H:%M:%S",localtime(&t));
                       
                        //最终将数据的信息插入到数据库sql中的表中
                        sprintf (sql, "INSERT INTO Temp_data (Temp,TIME) VALUES(%f,%f,'%s');",result,s);
                        printf("sql: %s\n", sql);
                       
                        //回调函数
                        sqlite3_exec (db, sql, 0, 0, &zErrMsg);
                        printf("zErrMsg=%d\n", zErrMsg);
                        char *sql="select Temp from Temp_data";//sql指针指向该字符串
                        int j=0;
                        sqlite3_exec (db, &sql, 0, 0, &zErrMsg);
                       
                        a=fvalue_h;
                        if(i==N){       
                                        while(j<10)
                                                {
                                               j++;
                                                }
                                        p=a;j=0;
                                       int lenth=change(p);
                                      
                                       //数组中数据的比对:
                                       int b;
                                        int i;
                                       printf("please input b: ");
                                       scanf("%d",&b);
                                       for(i = N; i>= 0; i--)
                                               {
                                                       printf("%f\n",a);//数据比对后显示数组
                                                       if(a>=b)
                                                                {
                                                               c++;
                                                                }
                                               }
                                       printf(">=b numbers is %d\n",c); //统计数组中大于特定值的个数
                                        }
                                        i++;
                                        sleep (1);
                }
       
    }
       
        }
                                  
        return (0);
       
}


//延时函数
void delay(int time)
{
   int j;
   for(j=0;j<time*1000;)
   j++;
}
int change(float *p)      
{ float *q=p;
        int j=0;
        float a;
        while(j<10)
        {
          j++;
        }
        int i;
        for(i=0;i<10;i++)
        {        printf("15\n");
                a=*(q+i);
                printf("%f\n",a);
        }
       
   int num = 0;
   int len = N ;
       
   for(i = 0 ; i < N ;i++)
   {printf("16\n");
    if(a>=30.0000|a<=20.0000 )
                {
                        num++ ;
                        len-- ;
                }
    else
                {   
                        a = a ;
                }      
   }
    return len ;   
}





笨笨熊ll 发表于 2013-5-14 15:37:26

笨笨熊ll 发表于 2013-5-14 15:26 static/image/common/back.gif


这是我的代码,希望您帮看下。我现在也是初学阶段,还有好多东西不懂,希望您能帮我看看代码。十分感谢!

笨笨熊ll 发表于 2013-5-14 18:01:05

TQ-lkp 发表于 2013-5-14 09:11 static/image/common/back.gif
1、波特率
2、字符处理的方法
尽量不要以附件的形式,一般是不会看的,直接贴代码

这是我的代码,希望您帮看下。我现在也是初学阶段,还有好多东西不懂,希望您能帮我看看代码。十分感谢!

TQ-lkp 发表于 2013-5-15 10:22:19

//将温度数据读入到寄存器中,并送入到数据库中
                        fvalue_t=0.0,fvalue_h=0.0;value_t=0;value_h=0;
                      ret=read(fd,buf,1);
                        printf ("read data is 0x%02X-0x%02X\n",buf, buf);
这个地方你只读了一个字节,后面用了不止一个字节
页: [1]
查看完整版本: TQ6410与ZigBee传输数据的问题