qq_27671247
qq_27671247
2015-12-02 07:49
采纳率: 100%
浏览 1.7k

求大神,linux串口通信方面!!!7445CPU串口和CC2530通信验证

我现在有一块7444的开发板,想实现7444通过串口传输命令给7444开发板上的另一模块cc2530(zigbee中的协调器),然后发送给给第三方开发板(只要当前cc2530能接收到命令就能直接发送数据到zigbee终端,以实现),然后终端zigbee模块的温度数据回传到7444开发板上的CC2530协调器,再从串扣回传给7445,已知我当前的串口设备文件是tty1,怎么编写C程序读取改开发板上cc2530传来的温度数据,和通过串口给cc2530发送命令!
图片说明

上图是zigbee协议栈的串口程序,主要是
1、 接收到数据

2、 判断长度然后给数据包 pMsg 分配内存
3、 打包发送给上层 OSAL待处理
4、 释放内存
其中数据包中的数据部分格式是
datalen + data

本来CC2530是个独立的zigbee模块,直接通过RS232转串口可以直接在串口工具中显示终端发送来的温度数据和写入命令控制终端了,而现在在PC和CC2530之间加了一个arm的CPU,这个cpu和CC2530之间是通过串口连接通信的,问题就出现在这里了,这部分我没接触过个,所以不会,现在求个大神帮忙解决下。

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

2条回答 默认 最新

  • YJB666
    虛擬時間SOS 2015-12-04 04:48
    已采纳

    好吧 我贴个以前写的代码给你看看!!里面有设置串口协议的 反正自己留着也没用给大家看吧 这个是linux C的

    1. //短信接收端 //2013-11-6 //yang //完成于2013-11-7 #include #include #include #include #include #include #include #include char change(char *p); int jiema(char *q); char * unicode_utf8(char *ch); int utf_unicode(char *output,char input,int x);

    int setS0(void)
    {
    int fd=0,ret=0;
    struct termios old,new;
    fd = open("/dev/ttyS0",O_RDWR); //U转串
    if(fd == -1)
    {
    perror("open");
    //exit(0);
    }
    int g = tcgetattr(fd,&old);
    if(g == -1)
    {
    printf("COM get fail\n");
    //exit(0);
    }
    new = old;

    cfsetispeed(&new,B9600); 
    cfsetospeed(&new,B9600); 
    new.c_cflag |= (CLOCAL | CREAD);
    
    new.c_cflag &= ~PARENB;
    new.c_cflag &= ~CSTOPB;
    new.c_cflag &= ~CSIZE;      //取消原有设置
    new.c_cflag |= CS8;
    tcsetattr(fd,TCSANOW,&new); //立即生效
    return fd;
    

    }

    int main()
    {
    //char chr[350]="0891683108200945F7240D91688186929197F5000831116001516423044F60597D4F60597D";
    char chr[350]={'\0'};
    int a=0,b=0,ret=0;
    char ch[350]="",ch1[25]="",ch2[25]="",ch3[25]="";
    char *pn=NULL;
    int fd=setS0(); //设置端口
    char *p=NULL, *q=NULL;
    write(fd,"ate0\r",5); //关闭回显
    sleep(1);
    write(fd,"at+cmgf=0\r",10); //设置读取格式
    sleep(1);

    tcflush(fd, TCIOFLUSH);
    sleep(1);
    ret = 0;
    while(1)
    {
    

    //*

    ret=read(fd,ch3+strlen(ch3),20-strlen(ch3));
    if(ret <= 0)
    continue;
    printf("read===[%s]\n",ch3);
    if(strstr(ch3,"+cmti:") == NULL)
    {
    printf("未发现新短信信息\n");
    sleep(2);
    continue;
    }
    else
    {

            p=strchr(ch3,',');  
            if(p == NULL)
            continue;
    
            q = strchr(p, '\r');
            if(q == NULL)
            q = strchr(p, '\n');
            if(q == NULL)
            continue;
            memset(ch2,'\0',25);
            printf("len = %d\n",q-p-1);
            memcpy(ch2,p+1,(q-p-1));
            write(fd,"at+cmgr=",strlen("at+cmgr="));
            write(fd,ch2,strlen(ch2));
            write(fd, "\r", 1);
            printf("write:===[at+cmgr=%s]\n",ch2);
            sleep(1);
            memset(chr,'\0',sizeof(chr));
            ret = read(fd,chr,350);
            printf("read_ret: %d\n", ret);
            printf("rcv mesg is [%s]\n",chr);
    

    //*/

    //9168
    //08

            //p = strstr(chr, "9168");      //查找9168
            p = strstr(chr, "9168");
            if(p == NULL)
            {
                printf("can fand 9168\n");
                exit(0);
            }
            pn=p-2;
            printf("%s\n",pn);
            printf("ch2:%s\n",ch2);
            memcpy(ch2,pn,2);
            sscanf(ch2,"%02X",&a);
            a=(a*2-4);
            printf("a===%d\n",a);
            memset(ch,'\0',350);
            memcpy(ch,pn+6,a);
            printf("ch====%s\n",ch);
            change(ch);
            ch[strlen(ch)-1]='\0';
            printf("center num==%s\n",ch);
    
            memset(ch2,'\0',25);
            memcpy(ch2,pn+8+a,2);
            //printf("0d==%s\n",ch);
            sscanf(ch2,"%02X",&b);
            printf("来源号码长度=%d\n",b);
    
            memset(ch1,'\0',25);
            memcpy(ch1,(pn+(14+a)),b);
            change(ch1);
            ch1[strlen(ch1)-2]='\0';
            printf("message is from :%s\n",ch1);
    
            memset(ch1,'\0',25);
            memcpy(ch1,(pn+(17+a+b)),14);
            puts(ch1);
            change(ch1);
    
            int year=0,month=0,day=0,hour=0,mine=0,secort=0;
            sscanf(ch1,"%2d%2d%2d%2d%2d%2d",&year,&month,&day,&hour,&mine,&secort);
            printf("send messages time is :%02dyear%02dmonth%02dday\t%2d:%2d:%2d\n",year,month,day,hour,mine,secort);
            memset(ch,'\0',350);
            memcpy(ch,pn+(a+b+17+14),2);    //拷贝信息长度16进制
            printf("16len===%s\n",ch);
            sscanf(ch,"%02X",&a);
            printf("rcv message len is: %d bit\n",a);
            memset(ch,'\0',350);
            memcpy(ch,pn+(a+b+41),350);
    

    printf("ch: [%s]\n", ch);
    char *s=unicode_utf8(ch);
    printf("rcv message is: [%s]\n",s);
    }

    }

    }

    /*___________________________changed_______________________________*/
    char change(char *p)
    {
    int i=0,j=0;
    char tem[2]={'\0'};
    for(j=0;j<strlen(p)/2;j++)
    {
    tem[0]=
    (p+i);
    (p+i)=(p+i+1);
    *(p+i+1)=tem[0];
    i+=2;
    }
    printf("p==%s\n",p);
    }

    char * unicode_utf8(char *ch) //----------------解码函数
    {
    int x=0;
    int n;
    int unicode_len=strlen(ch); //计算传入的字符长度
    wchar_t wch[70]=L"\0";
    char *utf=(char *)malloc(70);
    setlocale(LC_ALL,"zh_CN.UTF-8"); //设置本地编码格式
    for(x=0;x<unicode_len-1;x++)
    {
    sscanf(ch+4*x,"%04X",wch+x); //将十六进制转换成宽整形
    }
    *(wch+x)='\0'; //在宽整形后面追加上结束标志
    n=wcstombs(utf,wch,unicode_len); //将宽整形转换成汉字,让utf指针指向他
    *(utf+x)='\0';
    puts(utf);
    return utf; //返回指针
    }

    点赞 评论
  • YJB666
    虛擬時間SOS 2015-12-03 11:05

    将温度从开发板温度文件读出(read(fd) 需要去查板子上的文件描述),通过串口发送(一般要自己定好协议)tty1

    点赞 评论

相关推荐