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

好吧 我贴个以前写的代码给你看看!!里面有设置串口协议的 反正自己留着也没用给大家看吧 这个是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; //返回指针
}

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

YJB666
虛擬時間SOS 好吧 我贴个以前写的代码给你看看!!里面有设置串口协议的 反正自己留着也没用给大家看吧 这个是linux C的
4 年多之前 回复
qq_27671247
qq_27671247 协议这块有点搞不懂。求能详解下吗!!谢谢
4 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问