QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 1074|回复: 4

串口通信(续三)改正

[复制链接]
发表于 2006-4-26 09:47:40 | 显示全部楼层 |阅读模式
还是串口通信的问题:
我想获取往gtk_entry里输入的内容并将其放进一个数组里buf_send里,然后通过串口传到另一台电脑的串口调试助手里将其显示,编译以后别的输出一切正常,另一台电脑也能收到我写进entry里的内容,可是程序里的语句
perror("write");输出确是write:非法seek操作.
这到底是哪里除了问题呢,大家能否给我指点一下!
以下是我的callbacks.c文件里的程序代码,entry在文件face.c里定义的:

[code:1]
#include<gtk/gtk.h>
#include<string.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<termios.h>
#include<stdio.h>
#include<errno.h>

//声明entry1是个已定义的外部变量
extern *entry1;
//全局变量
char buf_send[1024];

//发送函数声明
//鉴于要检查串口是否通和其它参数情况,把串口通信函数设置成有返回值是有必要的
int datasend(char *dev,int speed);



void on_ok_button_clicked(GtkWidget *button,gpointer data)
{
int i;
char *get=gtk_entry_get_text(GTK_ENTRY(entry1));
for(i=0;*get!='\0';get++,i++)
buf_send[i]=*get;
buf_send[i]='\0';
//调用"串口发送数据"函数
datasend("/dev/ttyS0",38400);
}

int on_cancel_button_clicked(GtkWidget *button,gpointer data)
{
gtk_main_quit();
return FALSE;
}


int datasend(char *dev,int speed)
{
int fd,i,ret,write_return;
int speed_arr[]={B38400,B115200,B9600};
int name_arr[]={38400,115200,9600};
struct termios ttyold,ttynew;

fd=open(dev,O_RDWR|O_NOCTTY|O_NDELAY);
perror("/dev/ttyS0");
printf("fd=%d\n",fd);
if(!fd)
{
printf("cannot open %s\n",dev);
return -1;
}

ret=tcgetattr(fd,&ttyold);
if(ret<0)
{
printf("tcgetattr error!\n");
close(fd);
return -1;
}
bzero(&ttynew,sizeof(ttynew));

//设置波特率
for(i=0;i<sizeof(speed_arr)/sizeof(int);i++)
{
if(speed=name_arr[i])
{
cfsetispeed(&ttynew,speed_arr[i]);
cfsetospeed(&ttynew,speed_arr[i]);
break; //注意break的位置
}
}

//设置8位数据位
ttynew.c_cflag=(ttynew.c_cflag&~CSIZE)|CS8;
//设置1位停止位
ttynew.c_cflag&=~CSTOPB;
//无奇偶校验
ttynew.c_cflag&=~PARENB;
ttynew.c_iflag&=~INPCK;
ttynew.c_cflag|=(CLOCAL|CREAD);

//设置无硬件流控制
ttynew.c_cflag&=~CRTSCTS;
//设置无软件流控制
ttynew.c_iflag&=~(IXON|IXOFF|IXANY);
//设置为原始输出
ttynew.c_oflag&=~OPOST;


//设置串口属性
tcflush(fd,TCIOFLUSH);
fcntl(fd,F_SETFL,0);
ret=tcsetattr(fd,TCSANOW,&ttynew);
if(ret<0)
{
printf("error while setting %s attribe\n",dev);
close(fd);
return -1;
}

//发送数据,注意字符数组长度的"计算方法"
write_return=write(fd,buf_send,strlen(buf_send));
printf("write_return=%d\n",write_return);
perror("write"); //就是此语句输出的问题.
tcsetattr(fd,TCSANOW,&ttyold);
close(fd);
return 0;
}
[/code:1]
            
发表于 2006-4-26 12:44:22 | 显示全部楼层
perror取全局的errno值来输出错误信息,你没检查是否有错误就用perror?
回复

使用道具 举报

 楼主| 发表于 2006-4-26 15:33:16 | 显示全部楼层
是啊,我不怎么懂这个perror的,我见它可以输出一些操作的结果,就用了!     
现在我把前面的一个perror(“/dev/ttyS0”);取消掉了之后write就没有问题了!
谢谢提示!
您能告诉我perror到底怎么用吗,有什么用呢?
回复

使用道具 举报

发表于 2006-4-26 17:31:31 | 显示全部楼层
当系统函数执行过程中遇到错误时,它会设置errno值,然后你可以检查系统函数的返回值,如果属于错误值,你就可以调用perror,perror会打印出错误原因。
回复

使用道具 举报

 楼主| 发表于 2006-4-26 17:53:52 | 显示全部楼层
好的,我会记住的!多谢啦     
回复

使用道具 举报

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

本版积分规则

GMT+8, 2024-11-2 18:29 , Processed in 0.051113 second(s), 16 queries .

© 2021 Powered by Discuz! X3.5.

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