主题 : 串口AT命令 复制链接 | 浏览器收藏 | 打印
try
级别: 新手上路
UID: 73201
精华: 0
发帖: 42
金钱: 210 两
威望: 42 点
综合积分: 84 分
注册时间: 2012-07-05
最后登录: 2013-06-19
楼主  发表于: 2012-07-11 11:08

 串口AT命令

最近在ARM11上整一个东西,用串口蓝牙模块,接到主板上,通过向蓝牙发送AT命令,读取反馈信息。
1.暂不带操作系统,我已经加入ramdisk文件系统。
2.在文件系统里运行linux应用程序。
这里是串口操作测试程序,与下列的驱动同步:
#include <stdio.h>  
#include <string.h>  
#include <fcntl.h>    //open(), read(), write()  
#define BUFSIZE 100  
int main(int argc, char* argv[])  
{  
    int fd, ret;  
    char buf[BUFSIZE];  
    char *msg = " ";// "AT\r\n";  
    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");
    while(1)  
    {  
        //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;  
        }  
       //printf("envi 4\n");
        if(buf[0] != '\0')  
        {  
            printf("%s\n", buf);  
        }  
    }  
    return 0;  
}
3.我自己也写了个串口驱动。UART3口接蓝牙。代码如下:
#if 1
#include <linux/platform_device.h>
#include <linux/module.h>  
#include <linux/kernel.h>  
#include <linux/init.h>
#include <asm/uaccess.h>          //copy_to_use, copy_from_user  
#include <linux/serial_core.h>  
#include <plat/regs-serial.h>  
#include <asm/io.h>               //readl, readb, writel, writeb  
#define BUFSIZE 100  
#define ttyS3_MAJOR 240  
#define ELFIN_UART_BASE        0xEC800000
#define ELFIN_UART3_OFFSET    0x0c00
#define IOBASE      (ELFIN_UART_BASE + ELFIN_UART3_OFFSET)
#define UART_ULCON3 IOBASE  
#define UART_UCON3  (IOBASE + 0x4)  
#define UART_UFCON3 (IOBASE + 0x8)
#define UART_UMCON3 (IOBASE + 0x0C)  
#define UART_UTRSTAT3   (IOBASE + 0x10)
#define UART_UFSTAT3     (IOBASE + 0x18)  
#define UART_UTXH3  (IOBASE + 0x20)  
#define UART_URXH3  (IOBASE + 0x24)  
#define UART_UBRDIV3    (IOBASE + 0x28)  
#define UART_UDIVSLOT3  (IOBASE + 0x2C)
#define UART_UINTP3   (IOBASE + 0x30)
#define UART_UINTSP3  (IOBASE + 0x34)
#define UART_UINTM3   (IOBASE + 0x38)  
#if 0
#define ULCON_OFFSET        0x00
#define UCON_OFFSET        0x04
#define UFCON_OFFSET        0x08
#define UMCON_OFFSET        0x0C
#define UTRSTAT_OFFSET        0x10
#define UERSTAT_OFFSET        0x14
#define UFSTAT_OFFSET        0x18
#define UMSTAT_OFFSET        0x1C
#define UTXH_OFFSET        0x20
#define URXH_OFFSET        0x24
#define UBRDIV_OFFSET        0x28
#define UDIVSLOT_OFFSET        0x2C
#define UINTP_OFFSET        0x30
#define UINTSP_OFFSET        0x34
#define UINTM_OFFSET        0x38
#endif


/*void writel(char value,long reg)   {
    *(volatile unsigned char *)(reg) = value;
}
char read(long reg) (
          return *(volatile unsigned char *)(ELFIN_UART_CONSOLE_BASE3 + UTXH_OFFSET);
}*/
int envi_open(struct inode *inode, struct file *filp)  
{  
    
    /* 8N1 */  
    writel(3, UART_ULCON3);  
    /* poll mode */  
    writel(0x2c5, UART_UCON3);  
    writel(0x47, UART_UFCON3);
    writel(0x00, UART_UMCON3);
    /* 9600 */  
    writel(0x15b, UART_UBRDIV3);
    writel(0x0000, UART_UDIVSLOT3);  
    return 0;  
}  
ssize_t envi_write(struct file *filp, const char __user *buf, size_t count, loff_t *f_pos)  
{  
    char wbuf[BUFSIZE]={0};  
    int state;  
    int i = 0,temp;  
    copy_from_user(wbuf, buf, count);  
    while(wbuf != '\0')  
    {  
         while(readl(UART_UFSTAT3) & (1<<14));
         state = readl(UART_UTRSTAT3);  
         if((0x02 & state) == 2)
        {  
            writeb(wbuf, UART_UTXH3);  
            printk("Rx data:%c\n",UART_UTXH3);
            i++;  
        }  
    }  
    for(temp = 0; temp < 600000 ; temp++){

        if(readl(UART_UFSTAT3) & (1<<14)){
         continue;    
    }
    else
        break;
    if(temp == 600000){

                printk("transmit error\n");    
        }
    }
    return 0;  
  
}  

//EXPORT_SYMBOL_GPL(uart3_write);

ssize_t envi_read(struct file *filp, char __user *buf, size_t count, loff_t *f_ops)  
{  
    /*char rbuf[1] = {0};  
    int state;  
    state = readl(UART_UTRSTAT3);  
    if((0x01 & state) == 1)  
    {  
        rbuf[0] = readb(UART_URXH3);  
        copy_to_user(buf, rbuf, 1);  
    }  
    else  
    {  
        set_current_state(TASK_INTERRUPTIBLE);  
        schedule_timeout(10);  
    }  
    return 0;  */


   //envi rewrite
   char rbuf[64]={0};
   int UFSTAT_REG,i;
   char FifoCount, UFSTAT3, RxDataReady,RxChar,UINTPReg,UINTMReg;
   UFSTAT_REG = readl(UART_UFSTAT3);
   FifoCount = UFSTAT_REG & 0x3f;
   UFSTAT3 = (UFSTAT_REG & (1<<6))&0xff;
   if(UFSTAT3 || FifoCount > 0)
           RxDataReady = 1;
   else
    RxDataReady = 0;

   while(RxDataReady){
           RxChar = readb(UART_URXH3);
                rbuf = RxChar;
                i++;
                printk("Rx data:%c\n",RxChar);
                UFSTAT_REG = readl(UART_UFSTAT3);
           FifoCount = UFSTAT_REG & 0x3f;
           UFSTAT3 = UFSTAT_REG & (1<<6);
           if(UFSTAT3 || FifoCount > 0)
                   RxDataReady = 1;
           else
            RxDataReady = 0;
   }
   copy_to_user(buf, rbuf, i);
   printk("i:%d\n",i);
   writel((readl(UART_UINTSP3)|0x01),UART_UINTSP3);
   UINTPReg = readb(UART_UINTP3);
   UINTMReg = readb(UART_UINTM3);
   if((UINTPReg & 0x01)||(UINTPReg & 0x02)){
    printk("do not clear int mask\n");
   }
   else{
         UINTMReg |= 0x01;
   }
                        
     UINTMReg &= ~0x01;    
     return 0;
}  


//EXPORT_SYMBOL_GPL(uart3_read);

int envi_release(struct inode *inode, struct file *filp)  
{  
    return 0;  
}  
struct file_operations ttyS3_fops =  
{  
    .owner = THIS_MODULE,  
    .open = envi_open,  
    .write = envi_write,  
    .read = envi_read,  
    .release = envi_release,  
};  
static __init int envi_init(void){
  
    int rc;  
    printk("s5p6450 serial module loaded!envi-->\n");  
    rc = register_chrdev(ttyS3_MAJOR, "s3c2410_serial3", &ttyS3_fops); //s3c2410_serial3
    printk("envi --> rc:%d",rc);
    if(rc < 0)  
    {  
        printk("Error: register s3c2410_serial3 device error!\n") ;  
        return -1;  
    }  
    return 0;  
}  

static __exit void envi_exit(void){
  
    unregister_chrdev(ttyS3_MAJOR, "s3c2410_serial3");  
    printk("s5p6450 serial module exit!\n");  
    return;  
}  

module_init(envi_init);  
module_exit(envi_exit);  

MODULE_AUTHOR("envi");  
MODULE_DESCRIPTION("s5p6450 serial driver");  
MODULE_LICENSE("GPL");
#endif

有问题:
1.我的应用程序在ramdisk文件系统不能正常运行。报语法错误。纠结了很久。运行./app 报出下列信息:
modprobe used greatest stack depth: 5608 bytes left                            
./app: line 1: ELF: not found                                              
./app: line 2: L: not found                                                    
./app: line 1: syntax error: word unexpected (expecting ")")    

寻求大家的帮助,谢谢!
[ 此帖被envi在2012-07-11 11:23重新编辑 ]
*無鈳取玳
级别: 论坛版主
UID: 27
精华: 12
发帖: 5398
金钱: 40120 两
威望: 17929 点
综合积分: 11036 分
注册时间: 2008-01-16
最后登录: 2014-11-22
1楼  发表于: 2012-07-11 12:36
能把你编译生成的文件打包传上来看看吗?
"If you have an apple and I have an apple and we exchange apples, then you and I will
still each have one apple. But if you have an idea and I have an idea and we exchange
these ideas, then each of us will have two ideas."
try
级别: 新手上路
UID: 73201
精华: 0
发帖: 42
金钱: 210 两
威望: 42 点
综合积分: 84 分
注册时间: 2012-07-05
最后登录: 2013-06-19
2楼  发表于: 2012-07-11 13:48
编译的文件打包
描述:文件打包
附件: app.tar.gz (4 K) 下载次数:10
try
级别: 新手上路
UID: 73201
精华: 0
发帖: 42
金钱: 210 两
威望: 42 点
综合积分: 84 分
注册时间: 2012-07-05
最后登录: 2013-06-19
3楼  发表于: 2012-07-11 14:17
会不会跟gcc有关系?
try
级别: 新手上路
UID: 73201
精华: 0
发帖: 42
金钱: 210 两
威望: 42 点
综合积分: 84 分
注册时间: 2012-07-05
最后登录: 2013-06-19
4楼  发表于: 2012-07-11 16:46
在网上找了好久 没有找到问题的根源。困惑ing
*無鈳取玳
级别: 论坛版主
UID: 27
精华: 12
发帖: 5398
金钱: 40120 两
威望: 17929 点
综合积分: 11036 分
注册时间: 2008-01-16
最后登录: 2014-11-22
5楼  发表于: 2012-07-11 18:00
这是用file命令查看你编译生成的app得到的信息:
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的共享库,你可能需要把它静态编译才能执行。
"If you have an apple and I have an apple and we exchange apples, then you and I will
still each have one apple. But if you have an idea and I have an idea and we exchange
these ideas, then each of us will have two ideas."
try
级别: 新手上路
UID: 73201
精华: 0
发帖: 42
金钱: 210 两
威望: 42 点
综合积分: 84 分
注册时间: 2012-07-05
最后登录: 2013-06-19
6楼  发表于: 2012-07-12 16:39

 回 5楼(kasim) 的帖子

谢谢斑竹
try
级别: 新手上路
UID: 73201
精华: 0
发帖: 42
金钱: 210 两
威望: 42 点
综合积分: 84 分
注册时间: 2012-07-05
最后登录: 2013-06-19
7楼  发表于: 2012-07-12 16:40
欢迎和大家共同探讨 见我的csdn博客  http://blog.csdn.net/zzobin/article/details/7740775