| 
 | 
 
我是基于贵公司所给的串口测试程序改的一个向串口发送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); 
} |   
 
 
 
 |