qq_27671247 2015-12-02 07:49 采纳率: 100%
浏览 1735
已采纳

求大神,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条回答

  • 虛擬時間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; //返回指针
    }

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥30 python代码,帮调试
  • ¥15 #MATLAB仿真#车辆换道路径规划
  • ¥15 java 操作 elasticsearch 8.1 实现 索引的重建
  • ¥15 数据可视化Python
  • ¥15 要给毕业设计添加扫码登录的功能!!有偿
  • ¥15 kafka 分区副本增加会导致消息丢失或者不可用吗?
  • ¥15 微信公众号自制会员卡没有收款渠道啊
  • ¥100 Jenkins自动化部署—悬赏100元
  • ¥15 关于#python#的问题:求帮写python代码
  • ¥20 MATLAB画图图形出现上下震荡的线条