zigbee模块与OK6410数据传输

2013tianyajuanke 2014-09-12 11:08:01
在IAR编译的CC2530的串口程序,连接PC机之后可以顺利的显示发送的数据zigbee connected successd,我将CC2530连接到6410上,然后在开发板上运行数据处理程序,6410和PC机通过串口连接,显示出zigbee发给开发板的数据,但是结果有问题,在电脑显示的结果是一整串的数据分段输出。
这两张图分别是zigbee与PC机相连接的串口输出图和zigbee与6410通过串口连接的输出图
...全文
256 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
傅利叶变换 2015-04-15
  • 打赏
  • 举报
回复
请问你是如何将协调器与6410连接,是通过串口线吗
2013tianyajuanke 2014-09-12
  • 打赏
  • 举报
回复
请问大家这个是什么原因造成的,下面贴出在6410运行的数据处理程序代码。 #include "cmodule.h" void error_fatal(const char *msg) { fprintf (stderr, "%s\n", msg); fprintf (stderr, "strerror() is %s\n", strerror(errno)); exit(1); } void wait_fd_write_eable(int fd) { fd_set wsets; FD_ZERO(&wsets); FD_SET(fd, &wsets); if (select(fd + 1, NULL, &wsets, NULL, NULL) < 0) { error_fatal(strerror(errno)); } } void wait_fd_read_eable(int fd) { fd_set rsets; FD_ZERO(&rsets); FD_SET(fd, &rsets); if (select(fd + 1, &rsets, NULL, NULL, NULL) < 0) { error_fatal(strerror(errno)); } } void init_cmodule() { front_rs232 = 0; rear_rs232 = 0; bempty_rs232 = 1; bfull_rs232 = 0; pthread_mutex_init(&mutex_rs232_empty, NULL); pthread_mutex_init(&mutex_rs232_full, NULL); pthread_cond_init(&conlock_rs232_empty, NULL); pthread_cond_init(&conlock_rs232_full, NULL); open_rs232_connect(); /*打开串口设备*/ } void open_rs232_connect() { int i, err; DeviceSpeed = DS; ByteBits = BB; for(i = 0; i < MAX_TRY; i++) { // fd_rs232 = open(DeviceName, O_RDWR);//+++++++++++++ // printf("DeviceName\n"); fd_rs232 = open( DeviceName, O_RDWR|O_NONBLOCK |O_NOCTTY); if (fd_rs232 < 0) { PDEBUG("%s\n", "open rs232 fail, after 3s will try again"); sleep(3); continue ; } break; } if (i == MAX_TRY && fd_rs232 < 0) { PDEBUG("%s\n", "open rs232 fail."); error_fatal(strerror(errno)); } if (fcntl(fd_rs232, F_SETFL, O_NONBLOCK) < 0) { error_fatal("Unable set to NONBLOCK mode"); } memset(&TtyAttr, 0, sizeof(struct termios)); TtyAttr.c_iflag = IGNPAR; TtyAttr.c_cflag = DeviceSpeed | HUPCL | ByteBits | CREAD | CLOCAL; TtyAttr.c_cc[VMIN] = 1; if (tcsetattr(fd_rs232, TCSANOW, &TtyAttr) < 0) { error_fatal("Unable to set comm port"); } PDEBUG("%s\n", "open rs232 succeed!"); } void *read_rs232(void *arg) { UCHAR buff[TMP_LENGTH], tmp; int cnt, bstart; bstart = cnt = 0; int n; for (;;) { if (front_rs232 != rear_rs232) { if (bstart) { buff[cnt++] = buf_rs232[front_rs232]; front_rs232 = (front_rs232 + 1) % MAX_BUFF_SIZE; if(bfull_rs232) { bfull_rs232 = 0; send_cond_signal(&conlock_rs232_full); } if (buff[cnt - 1] == RS232_END) { /*接收完一条完整的数据帧*/ PDEBUG("%s\n", "a complete message!"); tranmsg(buff, cnt); bstart = 0; cnt = 0; } } else { tmp = buf_rs232[front_rs232]; front_rs232 = (front_rs232 + 1) % MAX_BUFF_SIZE; if(bfull_rs232) { bfull_rs232 = 0; send_cond_signal(&conlock_rs232_full); } if (tmp == RS232_START) { bstart = 1; buff[cnt++] = tmp; }//else 丢弃还没检查到开始标志前的所有数据 } } else { PDEBUG("%s, f=%d, r=%d\n", "buf_rs232 is empty!", front_rs232, rear_rs232); bempty_rs232 = 1; block_cond_wait(&conlock_rs232_empty, &mutex_rs232_empty); } } } void sendcmd(UCHAR *msg, int len) { int n; wait_fd_write_eable(fd_rs232); n = write(fd_rs232, msg, len); } void tranmsg(UCHAR *msg, int len) { int i, n, num, k; UCHAR C_ID; TypeAddr Addr; UCHAR type; struct DeviceNode *p; PDEBUG("%s, %d\n", "tranmsg", len); for (i = 0; i < len; ++i) { PDEBUG("%2x ", msg[i]); } PDEBUG("%s\n", ""); n = msg[1]; /*获取数据长度*/ type = msg[2]; /*获取数据类型*/ if (type == 0x00) /*节点设备描述*/ { ; } else if (type == 0x01) /*节点数据*/ { num = msg[5]; p = (struct DeviceNode *)malloc(sizeof(struct DeviceNode) * num); /*这里处理的地址占两个字节*/ Addr = msg[3]; Addr <<= 8; Addr |= msg[4]; k = 0; for (i = 6; i < (n + 3); i += 3) { p[k].Addr = Addr; p[k].C_ID = msg[i]; p[k].data = msg[i + 1]; p[k].data <<= 8; p[k].data |= msg[i + 2]; k++; } output(p, num); } } void output(struct DeviceNode *p, int n) { int i; PDEBUG("%s, %d\n", "output", n); for (i = 0; i < n; ++i) { PDEBUG("%x %x %x\n", p[i].Addr, p[i].C_ID, p[i].data); } } void *test_sendcmd(void *arg) { int i, len; UCHAR buff[] = "$AA10#"; len = 6; while (1) { buff[4] = '0'; for (i = 0; i < 10; ++i) { sendcmd(buff, len); PDEBUG("%s\n", buff); buff[4]++; sleep(3); } } } void *write_rs232(void * arg) { UCHAR buff[TMP_LENGTH]; int n; int front, rear; int i; for (;;) { wait_fd_read_eable(fd_rs232); n = read(fd_rs232, buff, TMP_LENGTH); buff[n] = '\0'; PDEBUG("buff: %s\n", buff); PDEBUG("write_rs232: %d\n", n); for (i = 0; i < n; i++) { PDEBUG("%x ", buff[i]); } PDEBUG("%s\n", ""); if(n > 0) { for (i = 0; i < n; ++i) { rear = rear_rs232; rear = (rear + 1) % MAX_BUFF_SIZE; if (rear != front_rs232) { buf_rs232[rear_rs232] = buff[i]; rear_rs232 = rear; if(bempty_rs232) { bempty_rs232 = 0; send_cond_signal(&conlock_rs232_empty); } } else { PDEBUG("%s, f=%d, r=%d\n", "buf_232 is full!", front_rs232, rear_rs232); i--; bfull_rs232 = 1; block_cond_wait(&conlock_rs232_full, &mutex_rs232_full); } } } else { error_fatal("read rs232 n <= 0"); } } } void block_cond_wait(pthread_cond_t *pcond, pthread_mutex_t *pmutex) { pthread_mutex_lock(pmutex); pthread_cond_wait(pcond, pmutex); pthread_mutex_unlock(pmutex); } void send_cond_signal(pthread_cond_t * pcond) { pthread_cond_signal(pcond); } void run_cmodule() { int err; pthread_t tid_write_rs232; pthread_t tid_read_rs232; pthread_t tid_test_sendcmd; init_cmodule(); err = pthread_create(&tid_read_rs232, NULL, read_rs232, NULL); if (err != 0) { error_fatal("can't create thread: read_rs232"); } PDEBUG("%s\n", "create thread: read_rs232"); err = pthread_create(&tid_write_rs232, NULL, write_rs232, NULL); if (err != 0) { error_fatal("can't create thread: write_rs232"); } PDEBUG("%s\n", "create thread: write_rs232"); err = pthread_create(&tid_test_sendcmd, NULL, test_sendcmd, NULL); if (err != 0) { error_fatal("can't create thread: test_sendcmd"); } PDEBUG("%s\n", "create thread: test_sendcmd"); for (;;) { ; } } int main(int argc, char *argv[]) { run_cmodule(); return 0; }
2826635869 2014-09-12
  • 打赏
  • 举报
回复
这个问题 解决了吗 怎么样啊 请教请教啊 网赐教

23,117

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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