QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 3225|回复: 4

linux串口发ASCII命令

[复制链接]
发表于 2007-3-1 15:47:56 | 显示全部楼层 |阅读模式
我有一个读卡器,可以读写磁条卡。我想在linux下用C语言来控制该读卡器,但是不知道如何用C语言来发送和接收ASCII命令。请教了!
发表于 2007-3-1 16:35:15 | 显示全部楼层
串口吗? 打开串口设备,设置好波特率什么的,然后读写就好了
回复

使用道具 举报

 楼主| 发表于 2007-3-1 16:51:42 | 显示全部楼层
打开成功,读写有问题。有谁做过这样的东西吗?可否给我来个例子。
回复

使用道具 举报

发表于 2007-3-1 17:07:31 | 显示全部楼层
我用python写过读取条形码的小程序。

你不说有什么问题,叫别人怎么和你说? 贴出代码来看看
回复

使用道具 举报

发表于 2007-4-5 14:01:15 | 显示全部楼层
[quote:e99a88eebd="secpoint"]打开成功,读写有问题。有谁做过这样的东西吗?可否给我来个例子。[/quote]
设置硬件驱动的问题吧,
下面是串口的操作/dev/ttyS0



[code:1]
int OpenDev(char *);
void Set_speed(int fd, int speed);
int Set_Parity(int fd,int databits,int stopbits,int parity);

int main(int argc, char **argv)
{
        int fd;
        int nread;
        char buff[512];
        char *dev  = argv[1]; /* serial 2 */
       
        memset(buff,'a',sizeof(buff) - 1);
        buff[sizeof(buff) - 1] = '\0';
       
        if (argc != 2) {
                pritnf("Usage: %s serialport\n",argv[0]);
                exit(1);       
        }
       
        fd = OpenDev(argv[1]);        /* open the device */
        if (fd == -1) {
                exit(1);       
        }
       
        Set_speed(fd, 19200);        /* set serial baud */
       
        if (Set_Parity(fd, 8, 1, 'N') == FALSE) {
                printf("Set Parity Error\n");
                exit (1);
        }
       
        while (1) {   
                puts("ready to read!\n");
                while ((nread = read(fd, buff, 512)) > 0) {
                        printf("\nLen %d\n",nread);
                        buff[nread+1] = '\0';   
                        printf( "\n%s", buff);   
                }
        }
       
        close(fd);  
        return 0;
}

/* open device */
int
OpenDev(char *Dev)
{
        int        fd = open( Dev, O_RDWR );
        //int fd = open(Dev, O_RDWR | O_NOCTTY | O_NDELAY);
               
        if (fd == -1) {                        
                perror("Can't Open Serial Port");
                return -1;               
        }       
        else       
                return fd;
}

/**
*@brief  设置串口通信速率
*@param  fd     类型 int  打开串口的文件句柄
*@param  speed  类型 int  串口速度
*@return  void
*/

void
Set_speed(int fd, int speed)
{
        int   i;
        int   status;
        struct termios   Opt;
        int speed_arr[] = { B38400, B19200, B9600, B4800, B2400, B1200, B300, B38400, B19200, B9600, B4800, B2400, B1200, B300, };
        int name_arr[] = {38400,  19200,  9600,  4800,  2400,  1200,  300, 38400, 19200,  9600, 4800, 2400, 1200,  300, };
       
        tcgetattr(fd, &Opt);
         
        for ( i= 0;  i < sizeof(speed_arr) / sizeof(int);  i++) {
                if (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 fd");  
                                return;     
                        }   
                       
                        tcflush(fd,TCIOFLUSH);   
                }  
        }
}

/**
*@brief   设置串口数据位,停止位和效验位
*@param  fd     类型  int  打开的串口文件句柄
*@param  databits 类型  int 数据位   取值 为 7 或者8
*@param  stopbits 类型  int 停止位   取值为 1 或者2
*@param  parity  类型  int  效验类型 取值为N,E,O,,S
*/
int
Set_Parity(int fd,int databits,int stopbits,int parity)
{
        struct termios options;
       
        if  ( tcgetattr( fd,&options)  !=  0) {
                perror("SetupSerial get");     
                return(FALSE);  
        }
        options.c_cflag &= ~CSIZE;
       
        /* set databit */
        switch (databits){   
        case 7:               
                options.c_cflag |= CS7;
                break;
        case 8:     
                options.c_cflag |= CS8;
                break;   
        default:   
                fprintf(stderr,"Unsupported data size\n"); return (FALSE);  
        }
       
        /* set paritybit */
        switch (parity){   
                case 'n':
                case 'N':                /* not parity */   
                        options.c_cflag &= ~PARENB;   /* Clear parity enable */
                        options.c_iflag &= ~INPCK;     /* Enable parity checking */
                        break;  
                case 'o':   
                case 'O':     
                        options.c_cflag |= (PARODD | PARENB); /* 设置为奇效验*/  
                        options.c_iflag |= INPCK;             /* Disnable parity checking */
                        break;  
                case 'e':  
                case 'E':   
                        options.c_cflag |= PARENB;     /* Enable parity */   
                        options.c_cflag &= ~PARODD;   /* 转换为偶效验*/     
                        options.c_iflag |= INPCK;       /* Disnable parity checking */
                        break;
                case 'S':
                case 's':  /*as no parity*/   
                            options.c_cflag &= ~PARENB;
                        options.c_cflag &= ~CSTOPB;
                        break;  
                default:   
                        fprintf(stderr,"Unsupported parity\n");   
                        return (FALSE);  
        }  
       
        /* set stop bit */  
        switch (stopbits){   
                case 1:   
                        options.c_cflag &= ~CSTOPB;  
                        break;  
                case 2:   
                        options.c_cflag |= CSTOPB;  
                           break;
                default:   
                        fprintf(stderr,"Unsupported stop bits\n");  
                        return (FALSE);
        }
       
        /* Set input parity option */
        if (parity != 'n')   
                options.c_iflag |= INPCK;
       
        tcflush(fd,TCIFLUSH);
       
        /* set timeout 15 seconds */
        options.c_cc[VTIME] = 150;   
        options.c_cc[VMIN] = 0;
       
        /* Update the options and do it NOW */
        if (tcsetattr(fd,TCSANOW,&options) != 0){
                perror("SetupSerial set");   
                return (FALSE);  
        }
       
        return (TRUE);  
}
[/code:1]
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-11-2 00:23 , Processed in 0.064547 second(s), 16 queries .

© 2021 Powered by Discuz! X3.5.

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