#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/mman.h>
#include <linux/input.h>
#include <stdlib.h>
#include <asm/types.h>
#include <pthread.h>
#include <string.h>
#include <termios.h>
int jiaoyan(char SerBfr[])
{
char BCC = 0;
int i;
for(i = 0; i<(SerBfr[0]-2); i++)
{
BCC ^= SerBfr[i];
}
SerBfr[SerBfr[0]-2] = ~BCC;
}
int main()
{
int card = 0;
int com_fd1 = open("/dev/ttySAC1",O_RDWR);
if (-1 == com_fd1)
{
printf("打开串口1失败!\n");
return -1;
}
struct termios ter;//首先,为了安全起见和以后调试程序方便,可以先保存原先串口的配置,在这里可以使用函数tcgetattr(fd, &old_cfg)。
//该函数得到fd指向的终端的配置参数,并将它们保存于termios结构变量old_cfg中。该函数还可以测试配置是否正确、该串口是否可用等。
//若调用成功,函数返回值为0,若调用失败,函数返回值为-1,
struct termios old_ter;
int ret = tcgetattr(com_fd1, &old_ter);
if (0 == ret)
{
printf("保存串口配置成功!\n");
}else
{
printf("保存串口配置失败!\n");
return -1;
}
cfmakeraw(&ter);//设备参数的设置
ter.c_cflag |= CLOCAL | CREAD;
cfsetispeed(&ter, B9600);// 输入波特率
cfsetospeed(&ter, B9600);// 输出波特率
ter.c_cflag &= ~CSIZE; /*用数据位掩码清空数据位设置*/
ter.c_cflag |= CS8;
ter.c_cflag &= ~PARENB;//无奇偶校验位
ter.c_cflag &= ~CSTOPB;/* 将停止位设置为一个比特 */
ter.c_cc[VTIME] = 0;
ter.c_cc[VMIN] = 1; //设置为至少有一个字节返回时才去读取
tcflush(com_fd1, TCIFLUSH);//清除缓冲
ret = tcsetattr(com_fd1,TCSANOW,&ter);
if (0 == ret)
{
printf("串口激活成功!\n");
}else
{
printf("串口激活失败!\n");
return -1;
}
unsigned char SerBfr_A[7] = {0};//命令的写入:请求天线范围内所有的卡、、此种serbfr函数为校验函数,就是把加密命令解码
SerBfr_A[0] = 0x07; //注意数组的定义和数组命令的提取中【 】
SerBfr_A[1] = 0X02;
SerBfr_A[2] = 0X41;
SerBfr_A[3] = 0X01;
SerBfr_A[4] = 0X52;
SerBfr_A[5] = 0;
SerBfr_A[6] = 0X03;
//printf("SerBfr[5] = %d\n",SerBfr_A[5] );
jiaoyan(SerBfr_A);//校验函数
//printf("SerBfr[5] = %d\n",SerBfr_A[5] );
while(1)
{
char message[10] ={0};//存放读取数据
bzero(message,10);//置字符串前n个字节为0.清零作用
//message[2] = 0x01;
write(com_fd1,SerBfr_A,7);
read(com_fd1,message,8);
if (0x00 == message[2] && 0x02 == message[3]) //判断数组2 3位元素是否符合
{
printf("找到卡了!\n");
unsigned char SerBfr_B[8] = {0};
SerBfr_B[0] = 0x08;
SerBfr_B[1] = 0x02;
SerBfr_B[2] = 0x42;
SerBfr_B[3] = 0x02;
SerBfr_B[4] = 0x93;
SerBfr_B[5] = 0x00;
SerBfr_B[6] = 0;
SerBfr_B[7] = 0x03;
jiaoyan(SerBfr_B);
char message_b[12] ={0};
bzero(message_b,12);
//message_b[2] = 0x01;
write(com_fd1,SerBfr_B,8);
read(com_fd1,message_b,12);
if (0x00 == message_b[2] )
{
printf("得到了卡号:%hd%hd%hd%hd\n",message_b[4],message_b[5],message_b[6],message_b[7] );
/* if ( 103 == message_b[4] && 116 == message_b[5] && 184 == message_b[6] && 125 == message_b[7] )
{
//printf("KEY3=%d\n",KEY);
card = 1;
break;
//printf("KEY4=%d\n",KEY);
} */
}
}else
{
printf("没找到!\n");
sleep(1);
}
}
close(com_fd1);
return 0;
}
编译后显示
已经包含了相应的头文件,为什么还是无法成功