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命令的困窘
版权声明:本文标题:串口AT命令的困窘 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.freenas.com.cn/jishu/1732355711h1534375.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论