admin 管理员组

文章数量: 887007

串口AT命令的困窘


  接上篇,既然应用程序不能运行,可以考虑其他方案。我在busybox里加入新的命令,同时这个新的命令也可以完成我需要的功能。Let me step by step:

 一、在busybox里加入新命令。

       我使用的busybox版本是busybox-1.13.3。

       step 1:

       在./miscutils目录下面新建源代码清单

       envi@envi-desktop:~/6450/busybox-1.13.3/miscutils$ gedit uart.c :

#include "libbb.h"
#include <stdio.h>  
#include <string.h>  
#include <fcntl.h>    //open(), read(), write()  
#define BUFSIZE 100
int uart_main(int argc, char* argv[]) MAIN_EXTERNALLY_VISIBLE;
int uart_main(int argc, char* argv[])  
{  
    int fd, ret;  
   // char size;
    char buf[BUFSIZE];  
    //while(1)  {
 
    char *msg =" ";// "AT+VERSION\r\n";   
    char *end = "\r\n";
        //do something 

   // 输入2个参数时候,将第二个命令参数传给msg

   //形如uart  AT,那么AT会赋给msg.

   //关于main函数带参数执行 见int main(int argc,char* argv[])详解

    if(argc == 2){

        msg = argv[1];
        strcat(msg,end);
    }
    //
    //打开uart3设备,与驱动通信
    fd = open("/dev/s3c2410_serial3", O_RDWR);//s3c2410_serial3
    //printf("envi serial test program\n");
    //printf("fd:%d\n",fd);
    if(fd < 0)  
    {  
        printf("Error: open /dev/s3c2410_serial3 error!\n");  
        return 1;  
    }  

   //发送命令
    ret = write(fd, msg, strlen(msg));  
    //printf("envi 1\n");
    if(ret < 0)  
    {  
        printf("Error: write msg error!\n");   
        return 1;  
    }  
    //printf("envi 2\n");

        //printf("while envi \n");
        memset(buf, 0, sizeof(buf));  

       //读取从蓝牙端的反馈信息
        ret = read(fd, buf, BUFSIZE);
        //printf("envi 3\n");
        if(ret < 0)  
        {  
            printf("Error: read device error!\n");   
            return 1;  
        }  
       // while(1)  
       //{  
       //printf("envi 4\n");

       //打印信息
        if(buf[0] != '\0')  
        {  
            printf("%s\n", buf);   
        }  

   // }
   // }  
    return 0;   
}

程序解读:在命令行里输入uart AT,主函数带参数AT,也就是发给蓝牙的命令。打开uart3设备,与驱动交互。向蓝牙发送AT命令,之后读取蓝牙的反馈信息。


step2:

在./busybox-1.13.3/miscutils/Kbuild文件中加入:

lib-$(CONFIG_UART)      += uart.o

确保编译与否。


step3:

在./busybox-1.13.3/miscutils/Config.in文件中加入:

config UART
    bool "uart"
    default y
    help
      uart is a  test command with uart of host side.

配置编译开关.


step4:

在./busybox-1.13.3/include/applets.h文件里,使其包含这个新命令,让uart这个新命令加入该组织,获得认可。但要注意的是要按照字母顺序添加.

USE_UART(APPLET(uart, _BB_DIR_BIN, _BB_SUID_NEVER))/*envi*/

解释下:创建链接uart命令实在系统文件/bin目录下,没有权限设置用户 id


step5:

可以在./busybox-1.13.3/include/usage.h文件里加入帮助信息。

#define uart_trivial_usage \
    "None"             /*envi*/
#define uart_full_usage "\n\n"  \
    "This is a uart test command."


执行结果如下:

                                                                               
Processing /etc/profile... Done                                                 
                                                                                
# uart AT                                                                       
OK                                                                              
                                                                                
     当然,自己也一直在想上篇的为什么不能运行,使用file命令看了下:

app: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.15, not stripped

        看起来这还是64位x86的执行档,当然无法在ARM平台上执行。需要把它交叉编译成ARM的执行档。另外,注意ramdisk文件系统里不一定有libc的共享库,可能需要把它静态编译才能执行。

        后来改了GCC编译,是在ARM上执行的。但还是不能执行。关于共享库和静态库,希望大侠们多给意见。感谢!

本文标签: 串口AT命令的困窘