ZigBee通过串口线和arm11开发板连接数据传输问题

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

//该程序实现的功能:将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[2];
unsigned short Temp = 0;
int flag = 0;
sqlite3 * db = NULL;
char *zErrMsg = 0;
int rc;
float a[N];
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[BUF_LEN] = { 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);
ioctl(fd,115200);
printf ("read data is 0x%02X-0x%02X\n",buf[1], buf[0]);
Temp = ((unsigned short) buf[1]) << 8;
Temp |= (unsigned short) buf[0];
printf ("no error here\n");
result = 0.0625 * ((double) Temp);
printf ("read data is 0x%02X-0x%02X\n",buf[1], buf[0]);
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 [20];
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[i]=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[i]);//数据比对后显示数组
if(a[i]>=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[N];
while(j<10)
{
j++;
}
int i;
for(i=0;i<10;i++)
{ printf("15\n");
a[i]=*(q+i);
printf("%f\n",a[i]);
}

int num = 0;
int len = N ;

for(i = 0 ; i < N ;i++)
{printf("16\n");
if(a[i]>=30.0000|a[i]<=20.0000 )
{
num++ ;
len-- ;
}
else
{
a[i-num] = a[i] ;
}
}
return len ;
}







...全文
997 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
相识即缘 2014-05-31
  • 打赏
  • 举报
回复
楼主,你的例子在6410开发板上执行,出现segment fault 错误
ifreecoding 2013-09-24
  • 打赏
  • 举报
回复
建议你调试时别搞这么复杂,一步步来,先看看zigbee通信正常不,不管是AT还是API模式,找2个zigbee板子,直接使用串口通信,看看收发数据正确不?
bingchentiao 2013-09-23
  • 打赏
  • 举报
回复
楼主,请问你的问题解决了吗?我是让zigbee向OK6410的UART1发送数据,可是6410板上总不能正确接收不知道是怎么回事,楼主要是知道怎么解决,麻烦您给个建议!非常感谢!!

3,846

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 无线
社区管理员
  • 无线
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧