unix下的串口通讯

fisher 2001-02-27 07:27:00
急欲开发一unix下的串口通讯程序
因对unix不很熟悉
有几点困惑:
1。串口是设备文件,是否可以看做普通文件
2.要有交互处理的话,是否要用到TERmIOS结构,做终端处理
望赐教
...全文
137 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
fisher 2001-02-28
  • 打赏
  • 举报
回复
 leonqin(清凉) &&out4b(阿狗) 
谢谢了
可以把你们的EMAIL和OICQ告诉我吗
希望和你们多交流一下
leonqin 2001-02-28
  • 打赏
  • 举报
回复
leon_qin@21cn.com

;-) HOHO
out4b 2001-02-28
  • 打赏
  • 举报
回复
out4b@21cn.com

欢迎交流

=================================================================
** The significant problems we face cannot be solved by the same
** level of thinking that created them. --- Albert Einstein
=================================================================

out4b
leonqin 2001-02-27
  • 打赏
  • 举报
回复
1.正确,可以看成普通文件进行操作。
2.正确,需要使用termios进行端口设置。
下面是一个程序,用于Linux的,没有太大区别。
#include "SerialReader.h"
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <termios.h>
#include <stdio.h>

#define BAUDRATE B1200
#define MODEMDEVICE "/dev/ttyS0"
#define _POSIX_SOURCE 1 /* POSIX compliant source */
#define FALSE 0
#define TRUE 1

JNIEXPORT jint JNICALL Java_SerialReader_initPort(JNIEnv* env, jclass obj)
{
int fd;
struct termios oldtio,newtio;

fd = open(MODEMDEVICE, O_RDWR | O_NOCTTY ); (打开端口,返回一个文件描述符)
if (fd <0) {perror(MODEMDEVICE); exit(-1); }

tcgetattr(fd,&oldtio); 保存旧的termios

bzero(&newtio, sizeof(newtio));
newtio.c_cflag = BAUDRATE | CS7 | CLOCAL | CREAD;(设置速率、数据位、控制选项)
newtio.c_iflag = IGNPAR;(忽略奇偶校验错的位)
newtio.c_oflag = 0;

newtio.c_lflag = 0;(设定为非交互模式、交互模式为ICANON)

newtio.c_cc[VTIME] = 0; (非交互模式超时设置)
newtio.c_cc[VMIN] = 1; (读取一个字符返回一次)

tcflush(fd, TCIFLUSH);
tcsetattr(fd,TCSANOW,&newtio);(设置新的termios)

return fd;
}

JNIEXPORT jstring JNICALL Java_SerialReader_readPort(JNIEnv *env, jclass obj, jint fd)
{ char buf[255];
char buffer[255];
int i = 0;
do
{ int res = read(fd,buf,1);
if (buf[0] != 0) buffer[i++] = buf[0];

}while(buf[0] != 10);

buffer[i] = 0;
printf("%s",buffer);
return (*env)->NewStringUTF(env, buffer);
}
以上是用于java的一个JNI程序,完成的功能是从串口读取一行字符,然后组装成字符串返回给调用的java程序。

我正在写这类程序,希望以后能在这里多多交流。 ;)
out4b 2001-02-27
  • 打赏
  • 举报
回复
1. 串口设备不应该看成普通文件, 应该是device special file. 但是对普通文件的操作如open(), read(), write()等也可用于串口设备文件. 串口设备属于字符方式设备.

2. 不知道你所说的交互处理是指什么? termios结构是用于控制终端的形态的, unix下对虚拟终端的操作都要用到他, 而并不是专用于串口设备. termios结构和出口设备应属两个概念.

Rechard. W. Stevens的<<Advanced Programming in the Unix Environment>>最后一章里有一个modem通信程序的例子, 你可以参考.

=================================================================
** The significant problems we face cannot be solved by the same
** level of thinking that created them. --- Albert Einstein
=================================================================

out4b
wwwunix 2001-02-27
  • 打赏
  • 举报
回复
1、可以用open()、close()、read()、write()等函数进行操作。

4,356

社区成员

发帖
与我相关
我的任务
社区描述
通信技术相关讨论
社区管理员
  • 网络通信
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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