串口配置函数

雪浪东陵 2014-08-22 10:26:15
最近做rs485串口控制云台的的调试,遇到一些问题,贴出来,请大家指教。
#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;
}


以上是我的控制代码,编译通过。请教一下,代码中配置波特率函数有问题吗?

下面是上面的函数在开发板中传输数据时示波器上显示出来的波形图,但是云台没有动:



下面这张是我用windows平台下的云台测试软件发送左转的命令时的波形图:云台左转了


下面这张是我根据上张的波形图,推测出来的数据,再通过开发板发送得到的波形图:云台没有动


有朋友可以帮我分析一下这个波形图不?。为什么第二幅图的云台动了,而第三幅的没有动,还有这个中间有时钟频率的影响吗?谢谢各位了
...全文
246 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
雪浪东陵 2014-08-25
  • 打赏
  • 举报
回复
还有一个问题,pc上这个都是向左转,怎么会出现两个不同的波形图,而且云台都向左转了。


mangoalx 2014-08-22
  • 打赏
  • 举报
回复
从图上看,确实时钟有一点差异,但是否造成误码不好说 可以微调一下波特率设置使之完全一致看看。

19,500

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 嵌入开发(WinCE)
社区管理员
  • 嵌入开发(WinCE)社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧