天嵌 ARM开发社区

 找回密码
 注册
查看: 1941|回复: 4

快来帮忙呀:很奇怪:一个关于串口的问题?

[复制链接]
csc_hyhyhy 发表于 2010-8-6 10:33:06 | 显示全部楼层 |阅读模式
我是基于贵公司所给的串口测试程序改的一个向串口发送AT命令的一个程序,只是在open和serial_rw()这两个地方有所改动,并把串口改为0,,但是连上短信猫就是没用,无法read。用串口调试工具向串口发送信息,ARM板上read返回-1,求解!!!!!!!
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <termios.h>
#include <errno.h>
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <unistd.h>
#include "pthread.h"

#include "serial_test.h"


struct serial_config serialread;

static int serial_fd,beep_fd;

int speed_arr[] = {B230400, B115200, B57600, B38400, B19200, B9600, B4800, B2400, B1200, B300,
                   B38400, B19200, B9600, B4800, B2400, B1200, B300};

int name_arr[] = {230400, 115200, 57600, 38400, 19200, 9600, 4800, 2400, 1200, 300,
                  38400, 19200, 9600, 4800, 2400, 1200, 300};

//-----------------------------------------------
//打开配置文件
//-----------------------------------------------
void print_serialread()
{
        printf("serialread.dev is %s\n",serialread.serial_dev);
        printf("serialread.speed is %d\n",serialread.serial_speed);
        printf("serialread.databits is %d\n",serialread.databits);
        printf("serialread.stopbits is %d\n",serialread.stopbits);
        printf("serialread.parity is %c\n",serialread.parity);
}

//-----------------------------------------------
//读取配置文件,并进行配置
//-----------------------------------------------
void readserialcfg()
{
        FILE *serial_fp;
        char j[10];
       
        printf("readserailcfg\n");

        serial_fp = fopen("/etc/tq2440_serial.cfg","r");
        if(NULL == serial_fp)
        {
                printf("can't open /etc/tq2440_serial.cfg");
        }
        else
        {
                fscanf(serial_fp, "DEV=%s\n", serialread.serial_dev);

                fscanf(serial_fp, "SPEED=%s\n", j);
                serialread.serial_speed = atoi(j);

                fscanf(serial_fp, "DATABITS=%s\n", j);
                serialread.databits = atoi(j);

                fscanf(serial_fp, "STOPBITS=%s\n", j);
                serialread.stopbits = atoi(j);

                fscanf(serial_fp, "PARITY=%s\n", j);
                serialread.parity = j[0];
        }

        fclose(serial_fp);
}

//-----------------------------------------------
//设置波特率
//-----------------------------------------------
void set_speed(int fd)
{
        int i;
        int status;
        struct termios Opt;
        struct termios oldOpt;
        tcgetattr(fd, &oldOpt);
//        printf("serialread.speed is %d\n",serialread.serial_speed);
        for( i = 0; i < sizeof(speed_arr)/sizeof(int); i++)
        {
                if(serialread.serial_speed == name_arr[i])
                {
                        tcflush(fd, TCIOFLUSH);
                        cfsetispeed(&Opt, speed_arr[i]);
                        cfsetospeed(&Opt, speed_arr[i]);
                        status = tcsetattr(fd, TCSANOW, &Opt);
                        if(status != 0)
                        {
                                perror("tcsetattr fd1");
                                return;
                        }
                        tcflush(fd, TCIOFLUSH);
                }
        }
}


//-----------------------------------------------
//设置其他的参数
//-----------------------------------------------
int set_Parity(int fd)
{
        struct termios options;
        struct termios oldoptions;
        if(tcgetattr(fd, &oldoptions) != 0)
        {
                perror("SetupSerial 1");
                return(FALSE);
        }

        options.c_cflag |= (CLOCAL|CREAD);
        options.c_cflag &=~CSIZE;
//        printf("serialread.databits is %d\n",serialread.databits);
        switch(serialread.databits)
        {
                case 7:
                        options.c_cflag |= CS7;
                        break;
                case 8:
                        options.c_cflag |= CS8;
                        break;
                default:
                        options.c_cflag |= CS8;
                        fprintf(stderr, "Unsupported data size\n");
                        return(FALSE);
        }
//        printf("serialread.parity is %c\n",serialread.parity);
        switch(serialread.parity)
        {
                case 'n':
                case 'N':
                        options.c_cflag &= ~PARENB;
                        options.c_iflag &= ~INPCK;
                        break;
                case 'o':
                case 'O':
                        options.c_cflag |= (PARODD | PARENB);
                        options.c_iflag |= INPCK;
                        break;
                case 'e':
                case 'E':
                        options.c_cflag |= PARENB;
                        options.c_cflag &= ~PARODD;
                        options.c_iflag |= INPCK;
                        break;
                default:
                        options.c_cflag &= ~PARENB;
                        options.c_iflag &= ~INPCK;
                        fprintf(stderr, "Unsupported parity\n");
                        return(FALSE);
        }
//        printf("serialread.stopbits is %d\n",serialread.stopbits);
        switch(serialread.stopbits)
        {
                case 1:
                        options.c_cflag &= ~CSTOPB;
                        break;
                case 2:
                        options.c_cflag |= CSTOPB;
                        break;
                default:
                        options.c_cflag &= ~CSTOPB;
                        fprintf(stderr, "Unsupported stop bits\n");
                        return(FALSE);
        }
        if(serialread.parity != 'n')
                options.c_iflag |= INPCK;
        options.c_cc[VTIME] = 0;        //150;                        //15 seconds
        options.c_cc[VMIN] = 0;
#if 1
        options.c_iflag |= IGNPAR|ICRNL;
        options.c_oflag |= OPOST;
        options.c_iflag &= ~(IXON|IXOFF|IXANY);                     
#endif
        tcflush(fd, TCIFLUSH);
        if(tcsetattr(fd, TCSANOW, &options) != 0)
        {
                perror("SetupSerial 3");
                return(FALSE);
        }
        return(TRUE);
}

//-----------------------------------------------
//打开串口设备
//-----------------------------------------------
int OpenDev(char *Dev)
{
        int fd = open(Dev, O_RDWR|O_NONBLOCK);
        if(-1 == fd)
        {
                perror("Can't Open Serial Port");
                return -1;
        }
        else
                return fd;
}

//--------------------------------------------------
串口初始化
////--------------------------------------------------
void serial_init(void)
{
        char *Dev;

        int i;

        readserialcfg();
        print_serialread();

        Dev = serialread.serial_dev;
        //?
        serial_fd = OpenDev(Dev);

        if(serial_fd > 0)
                set_speed(serial_fd);                //
        else
        {
                printf("Can't Open Serial Port!\n");
                exit(0);
        }
        //回复串口未阻塞状态
        if (fcntl(serial_fd, F_SETFL, O_NONBLOCK) < 0)
        {
                printf("fcntl failed!\n");
                exit(0);
        }
        //检查是否是终端设备?
/*#if 1        //如果屏蔽下面的代码,在串口就不会有回显的情况
        if(isatty(STDIN_FILENO)==0)
        {
                printf("standard input is not a terminal device\n");
        }
        else
                printf("isatty success!\n");
#endif*/
        //设置串口的参数
        if(set_Parity(serial_fd) == FALSE)
        {
                printf("Set parity Error\n");
                exit(1);
        }

}

void serial_rw()
{
        int i;
        char buff[512];
        char buff_t[]="AT\r";
        char receive[3];
        char buff4[] = "AT+CMGF=1\r";
        char buff2[] = "AT+CMGS=\"13836025032\"\r";
        char buff3[] = "this is a test message";
        int nread,nwrite;

        nwrite = write( serial_fd,buff_t,sizeof(buff_t) );
        printf("num of send:%d\n",nwrite);
        sleep(5);
        nwrite = write(serial_fd,buff4,sizeof(buff4));
        sleep(5);
        printf("end if mode select:%d\n",nwrite);       
        nwrite = write(serial_fd,buff2,sizeof(buff2));
        sleep(5);
        printf("nwrite=%d\n",nwrite);
        nwrite = write(serial_fd,buff3,sizeof(buff3));
        sleep(5);
        printf("send nwrite=%d\n",nwrite);
        nwrite = write(serial_fd,"\x1a",sizeof("\x1a"));
        sleep(5);
        printf("end of send message:%d\n",nwrite);
        while(1)
        {
                nread=read(serial_fd,receive,sizeof(receive));
                printf("nread is=%d\n",nread);
                perror("Read err");
                sleep(5);
        }

        close(serial_fd);

}

int main(int argc, char **argv)
{
        serial_init();

        serial_rw();       
        return 0;
//        close(serialread.serial_dev);
//        serial_test(telnum, telmoney);
}
nichmean 发表于 2010-8-13 01:16:06 | 显示全部楼层
解决了吗?我也是,遇到同样到问题,差不多到程序在pc上可以,但是放arm上就你只能write,不能read,不知道怎么回事。
machoe 发表于 2010-8-13 06:28:08 | 显示全部楼层
能不能把你的整个程序打成包帖出来,我回家帮你试试,现在没有环境。
shl00017517 发表于 2010-8-24 16:58:27 | 显示全部楼层
把你的短信猫串口的RTS脚拉高试试,一般GSM模块串口只连3线的话还需要将RTS脚拉高才会通信,如果你怀疑代码有问题,可以将开发板串口与PC串口连接看看能不能通信
dingyuanpu 发表于 2010-10-8 17:03:42 | 显示全部楼层
你是怎么解决的,我也是同样的问题!!!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

i.MX8系列ARM cortex A53 M4 工控板上一条 /1 下一条

Archiver|手机版|小黑屋|天嵌 嵌入式开发社区 ( 粤ICP备11094220号-2 )

GMT+8, 2024-9-18 04:21 , Processed in 1.025325 second(s), 20 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表