19,500
社区成员
发帖
与我相关
我的任务
分享
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <termios.h>
int set_com_config(int fd,int baud_rate,int data_bits,char parity,int stop_bits)
{
struct termios new_cfg,old_cfg;
int speed;
/*保存并测试现有的串口参数设置*/
if(tcgetattr(fd,&old_cfg)!=0){
perror("tcgetattr");
return -1;
}
/*设置字符大小*/
new_cfg = old_cfg;
cfmakeraw(&new_cfg);
new_cfg.c_cflag &= ~CSIZE;
/**/
switch(baud_rate)
{
case 2400:
{
speed = B2400;
}
break;
case 4800:
{
speed = B4800;
}
break;
case 9600:
{
speed = B9600;
}
break;
case 19200:
{
speed = B19200;
}
break;
case 38400:
{
speed = B38400;
}
break;
case 115200:
{
speed = B115200;
}
break;
}
cfsetispeed(&new_cfg,speed);
cfsetospeed(&new_cfg,speed);
/*数据位*/
switch(data_bits)
{
case 7:
{
new_cfg.c_cflag |=CS7;
}
break;
default:
case 8:
{
new_cfg.c_cflag |=CS8;
}
break;
}
/*奇偶校验*/
switch(parity)
{
default:
case 'n':
case 'N':
{
new_cfg.c_cflag &=~PARENB;
new_cfg.c_iflag &=~INPCK;
}
break;
case 'o':
case 'O':
{
new_cfg.c_cflag |= (PARODD | PARENB);
new_cfg.c_iflag |= INPCK;
}
break;
case 'e':
case 'E':
{
new_cfg.c_cflag |= PARENB;
new_cfg.c_cflag &= ~PARODD;
new_cfg.c_iflag |= INPCK;
}
break;
case 's':
case 'S':
{
new_cfg.c_cflag &= ~PARENB;
new_cfg.c_cflag &= ~CSTOPB;
}
break;
}
/*设置停止位*/
switch(stop_bits)
{
default:
case 1:
{
new_cfg.c_cflag &= ~CSTOPB;
}
break;
case 2:
{
new_cfg.c_cflag |= CSTOPB;
}
}
new_cfg.c_cc[VTIME] = 0;
new_cfg.c_cc[VMIN] = 1;
/*处理未接受字符*/
tcflush(fd,TCIFLUSH);
/*激活新配置*/
if((tcsetattr(fd,TCSANOW,&new_cfg))!=0){
perror("tcsetattr");
return -1;
}
return 0;
}
int main(int argc,char **argv)
{
//pelco_D协议的数据格式:数据格式:1位起始位、8位数据、1位停止位,无效验位。波特率:2400bp
static struct st_message{
char stx; //同步字
char address; //地址码
char command1,command2,command3,command4; //命令字1、2,数据1、2
char checksum; //校验码
}send_msg;
int n = 1;
int val ;
char buff[7] = {0x55,0x55,0x55,0x55,0x55,0x55,0x55};
//初始化pelco_D协议的内容,即向上向下移动的具体操作;
/*同步位,地址码,命令字1,命令字2,数据1,数据2,校验码
*/
//向左转
send_msg.stx = 0xff;
send_msg.address = 0x01;
send_msg.command1 = 0x00;
send_msg.command2 = 0x04;
send_msg.command3 = 0xff;
send_msg.command4 = 0x00;
send_msg.checksum = 0x04;
int fd = open("/dev/tts/0",O_WRONLY|O_SYNC);//打开设备文件
if(fd<0)
{
return -1;
}
//配置波特率,停止位,校验位,数据位
if(set_com_config(fd,2400,8,'N',1))
{
perror("fail of com config\n");
return -1;
}
while(n)
{
write(fd,&send_msg,sizeof(struct st_message));
//write(fd,&buff,7);
n--;
}
printf(" %0x,%0x,%0x,%0x,%0x,%0x,%0x\n",send_msg.stx,send_msg.address,send_msg.command1,send_msg.command2,send_msg.command3,send_msg.command4,send_msg.checksum);
printf("%d\n",sizeof(struct st_message));
close(fd);
return 0;
}