QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 1115|回复: 2

串口显示的问题

[复制链接]
发表于 2006-6-19 22:46:24 | 显示全部楼层 |阅读模式
我在主函数里打开串口,对串口接收到的数据进行在window里的entry里显示,只能显示发送数据的一部分,请问大家这是怎么回事啊? 请大家看以下我的程序给我一些指点!
[code:1]
#include<string.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<termios.h>
#include<stdio.h>
#include<errno.h>
#include<gtk/gtk.h>
#include<stdlib.h>
#include<unistd.h>
#include<signal.h>
#include<sys/times.h>
#include<memory.h>

#include"callbacks.h"
#include"face.h"

#define BAUDRATE B38400
#define SERIALDEVICE "/dev/ttyS0"

int fd;
extern GtkWidget *entry;
void receivedata(char *buffer);


int main(int argc,char *argv[])
{
GtkWidget *window;
int timer;
char *data_receive;
struct termios oldtio,newtio;

gtk_init(&argc,&argv);

window=create_window();
g_signal_connect(G_OBJECT(window),"delete_event",G_CALLBACK(gtk_main_quit),NULL);
gtk_widget_show_all(window);


//设置串口:
//打开串口
fd=open(SERIALDEVICE,O_RDWR|O_NOCTTY);
printf("fd=%d\n",fd);
//fd=open(SERIALDEVICE,O_RDWR|O_NOCTTY|O_NONBLOCK);
if(fd<0)
{
perror(SERIALDEVICE);
exit(-1);
//exit(1);
}

//设置串口属性
tcgetattr(fd,&oldtio);
bzero(&newtio,sizeof(newtio));
//波特率
cfsetispeed(&newtio,BAUDRATE);
cfsetospeed(&newtio,BAUDRATE);

//以下两个命令不管什么情况都要定义
newtio.c_cflag|=CLOCAL;
newtio.c_cflag|=CREAD;

//控制模式:非流控方式
newtio.c_cflag&=~CRTSCTS;

//数据位:8
newtio.c_cflag&=~CSIZE;
newtio.c_cflag|=CS8;

//无奇偶校验
newtio.c_cflag&=~PARENB;

//停止位:1
newtio.c_cflag&=~CSTOPB;

//输出模式:原始数据输出
newtio.c_oflag&=~OPOST;

//输入模式:原始数据输入
newtio.c_lflag&=~(ICANON|ECHO|ECHOE|ISIG);

//控制字符
newtio.c_cc[VMIN]=1;  //控制字符,所要读取字符的最小数量
newtio.c_cc[VTIME]=1;  //控制字符,读取第一个字符的等待时间

tcflush(fd,TCIOFLUSH);  //清除输入输出队列(有的资料上说:溢出的数据可以接收,但不读)
//fcntl(fd,F_SETFL,0);
//设置新属性,所有改编立即生效
tcsetattr(fd,TCSANOW,&newtio);

timer=gtk_timeout_add(5,(GtkFunction)receivedata,data_receive);  
gtk_main();
gtk_timeout_remove(timer);
return FALSE;
}



//串口接收数据函数
void receivedata(char *buffer)
{

int readlen,fs_sel;
fd_set fs_read;
struct timeval tv_timeout;


FD_ZERO(&fs_read);
FD_SET(fd,&fs_read);
tv_timeout.tv_sec=5;   
tv_timeout.tv_usec=0;   //指定的最大的等待时间为5秒

fs_sel=select(fd+1,&fs_read,NULL,NULL,&tv_timeout);
if(fs_sel){
         memset(buffer,0,sizeof(buffer));
         readlen=read(fd,buffer,sizeof(buffer));
         gtk_entry_set_text(GTK_ENTRY(entry),buffer);
         printf("buffer=%s\n",buffer);
           }         

}
[/code:1]
    经过编译以后,发现程序能够运行,但是就是在entry里面显示有问题,比如说我发送123400五个数字,只能在entry里显示1234或00,不能全部显示,不知道有什么问题,请大家帮忙看一下!
发表于 2006-6-20 12:20:25 | 显示全部楼层
printf("buffer=%s\n",buffer);
这行显示正常不?
回复

使用道具 举报

 楼主| 发表于 2006-6-22 08:18:16 | 显示全部楼层
应该没有问题啊,字符串都是这么输出的啊
回复

使用道具 举报

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

本版积分规则

GMT+8, 2024-11-2 12:25 , Processed in 0.054448 second(s), 16 queries .

© 2021 Powered by Discuz! X3.5.

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