secpoint 发表于 2007-3-1 15:47:56

linux串口发ASCII命令

我有一个读卡器,可以读写磁条卡。我想在linux下用C语言来控制该读卡器,但是不知道如何用C语言来发送和接收ASCII命令。请教了!

超级用户 发表于 2007-3-1 16:35:15

串口吗? 打开串口设备,设置好波特率什么的,然后读写就好了

secpoint 发表于 2007-3-1 16:51:42

打开成功,读写有问题。有谁做过这样的东西吗?可否给我来个例子。

超级用户 发表于 2007-3-1 17:07:31

我用python写过读取条形码的小程序。

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

darkroom 发表于 2007-4-5 14:01:15

打开成功,读写有问题。有谁做过这样的东西吗?可否给我来个例子。
设置硬件驱动的问题吧,
下面是串口的操作/dev/ttyS0




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设置串口通信速率
*@paramfd   类型 int打开串口的文件句柄
*@paramspeed类型 int串口速度
*@returnvoid
*/

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   设置串口数据位,停止位和效验位
*@paramfd   类型int打开的串口文件句柄
*@paramdatabits 类型int 数据位   取值 为 7 或者8
*@paramstopbits 类型int 停止位   取值为 1 或者2
*@paramparity类型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);
}
页: [1]
查看完整版本: linux串口发ASCII命令