一个爱徒步的~IT民工
4803
- 收藏
- 点赞
- 分享
- 举报
【学习资料】串口操作测试代码
#include //标准输入输出定义
#include //文件控制定义
#include //错误代码定义
#include //unix标准函数定义
#include//定义串口结构termios,并包含
#include //字符串函数定义
#define SERIAL_PORT "/dev/ttyS0" //使用串口1;1,2分别对应/dev/ttyS0和/dev/ttyS1
#define BAUDRATE B9600 //波特率为9600bps
#define MAX_SIZE 255
int main()
{
int int_SerialFD;
char Buff_Content[MAX_SIZE];
int int_Flag;
struct termios OldTerm,NewTerm; //数据结构termios,这个在文件include\asm-arm\termios.h中定义
int_SerialFD = open(SERIAL_PORT,O_RDWR|O_NOCTTY);//O_RDWR表示以读写方式打开串口,
//O_NOCTTY表示该程序不想成为该段口的控制终端,成功返回文件描述符,错误返回-1
if (int_SerialFD < 0) //出错显示错误
{
printf("Open serial port %s error",SERIAL_PORT);
perror("Error reason");
return(-1);
}
tcgetattr(int_SerialFD,&Old_Term); //得到串口的原始属性
bzero(&NewTerm,sizeof(NewTerm)); //清空新的串口属性结构
fcntl(int_SerialFD,F_SETFL,0); //阻塞read()操作,读不到数据就阻塞
NewTerm.c_cflag |= CLOCAL|CREAD; //使能接收,并设置本地状态
NewTerm.c_cflag &= ~PARENB; //无校验位
NewTerm.c_cflag &= ~CSTOPB; //一位停止位
NewTerm.c_cflag &= ~CSIZE; //屏蔽字符大小
NewTerm.c_cflag |= CS8; //8位数据
NewTerm.c_lflag &= ~(ICANON|ECHO|ECHOE|ISIC); //选择原始输入法
NewTerm.c_oflag &= ~OPOST; //选择原始数据输出
NewTerm.c_cc[VMIN] = 8; //指定所要读取字符的最小数量
NewTerm.c_cc[VTIME] = 1; //指定读取第一个字符的等待时间,时间的单位为n*100ms
//如果设置VTIME=0,则无字符输入时read()操作无限期的阻塞
cfsetispeed(&NewTerm,BAUDRATE); //设置串口输入端波特率
cfsetospeed(&NewTerm,BAUDRATE); //设置串口输出端波特率
int_Flag = tcsetattr(int_SerialFD,TCSANEW,&NewTerm); //立即将新属性赋予串口
if (int_Flag<0)
{
}
Buff_Content[0] = 1; //设置控制器地址编号
Buff_Content[1] = 0xfb; //设置取数据指令
int_Flag = write(int_SerialFD,Buff_Content,2); //发取数据指令
if (int_Flag<0)
{
}
int_Flag = read(int_SerialFD,Buff_Content,255); //返回实际读取的字符数目
printf("%d bytes read successfully.\n",int_Flag);
for(i=0;i
{
printf("%x\t",Buff_Content); //以16进制的形式输出字符
}
int_Flag = tcsetattr(int_SerialFD,TCSANOW,&OldTerm); //恢复原有串口的属性
if (int_Flag<0)
{
}
int_Flag = close(int_SerialFD); //关闭串口设备文件
if (int_Flag<0)
{
}
return(0);
}
#include
#include
#include
#include
#include
#define SERIAL_PORT "/dev/ttyS0" //使用串口1;1,2分别对应/dev/ttyS0和/dev/ttyS1
#define BAUDRATE B9600 //波特率为9600bps
#define MAX_SIZE 255
int main()
{
int int_SerialFD;
char Buff_Content[MAX_SIZE];
int int_Flag;
struct termios OldTerm,NewTerm; //数据结构termios,这个在文件include\asm-arm\termios.h中定义
int_SerialFD = open(SERIAL_PORT,O_RDWR|O_NOCTTY);//O_RDWR表示以读写方式打开串口,
//O_NOCTTY表示该程序不想成为该段口的控制终端,成功返回文件描述符,错误返回-1
if (int_SerialFD < 0) //出错显示错误
{
printf("Open serial port %s error",SERIAL_PORT);
perror("Error reason");
return(-1);
}
tcgetattr(int_SerialFD,&Old_Term); //得到串口的原始属性
bzero(&NewTerm,sizeof(NewTerm)); //清空新的串口属性结构
fcntl(int_SerialFD,F_SETFL,0); //阻塞read()操作,读不到数据就阻塞
NewTerm.c_cflag |= CLOCAL|CREAD; //使能接收,并设置本地状态
NewTerm.c_cflag &= ~PARENB; //无校验位
NewTerm.c_cflag &= ~CSTOPB; //一位停止位
NewTerm.c_cflag &= ~CSIZE; //屏蔽字符大小
NewTerm.c_cflag |= CS8; //8位数据
NewTerm.c_lflag &= ~(ICANON|ECHO|ECHOE|ISIC); //选择原始输入法
NewTerm.c_oflag &= ~OPOST; //选择原始数据输出
NewTerm.c_cc[VMIN] = 8; //指定所要读取字符的最小数量
NewTerm.c_cc[VTIME] = 1; //指定读取第一个字符的等待时间,时间的单位为n*100ms
//如果设置VTIME=0,则无字符输入时read()操作无限期的阻塞
cfsetispeed(&NewTerm,BAUDRATE); //设置串口输入端波特率
cfsetospeed(&NewTerm,BAUDRATE); //设置串口输出端波特率
int_Flag = tcsetattr(int_SerialFD,TCSANEW,&NewTerm); //立即将新属性赋予串口
if (int_Flag<0)
{
}
Buff_Content[0] = 1; //设置控制器地址编号
Buff_Content[1] = 0xfb; //设置取数据指令
int_Flag = write(int_SerialFD,Buff_Content,2); //发取数据指令
if (int_Flag<0)
{
}
int_Flag = read(int_SerialFD,Buff_Content,255); //返回实际读取的字符数目
printf("%d bytes read successfully.\n",int_Flag);
for(i=0;i
printf("%x\t",Buff_Content); //以16进制的形式输出字符
}
int_Flag = tcsetattr(int_SerialFD,TCSANOW,&OldTerm); //恢复原有串口的属性
if (int_Flag<0)
{
}
int_Flag = close(int_SerialFD); //关闭串口设备文件
if (int_Flag<0)
{
}
return(0);
}
我来回答
回答2个
时间排序
认可量排序
认可0
认可0
或将文件直接拖到这里
悬赏:
E币
网盘
* 网盘链接:
* 提取码:
悬赏:
E币
Markdown 语法
- 加粗**内容**
- 斜体*内容*
- 删除线~~内容~~
- 引用> 引用内容
- 代码`代码`
- 代码块```编程语言↵代码```
- 链接[链接标题](url)
- 无序列表- 内容
- 有序列表1. 内容
- 缩进内容
- 图片![alt](url)
相关问答
-
2010-06-01 23:25:04
-
2018-09-04 14:54:59
-
2019-08-19 14:46:40
-
2018-12-14 11:23:39
-
2012-11-24 18:00:50
-
2018-09-06 13:40:35
-
02020-11-16 17:44:59
-
2018-09-06 13:42:57
-
152017-01-04 14:16:57
-
2018-12-07 17:44:57
-
02018-12-13 11:21:54
-
2018-12-11 17:28:56
-
2013-08-25 00:37:22
-
2013-11-24 19:29:57
-
342019-07-19 19:18:52
-
2018-12-07 11:17:50
-
2018-12-07 14:10:03
-
2016-11-18 16:01:38
-
2021-01-04 17:46:29
无更多相似问答 去提问
点击登录
-- 积分
-- E币
提问
—
收益
—
被采纳
—
我要提问
切换马甲
上一页
下一页
悬赏问答
-
5Hi3516CV610 如何使用SD卡升级固件
-
5cat /dev/logmpp 报错 <3>[ vi] [func]:vi_send_frame_node [line]:99 [info]:vi pic queue is full!
-
50如何获取vpss chn的图像修改后发送至vo
-
5FPGA通过Bt1120传YUV422数据过来,vi接收不到数据——3516dv500
-
50SS928 运行PQtools 拼接 推到设备里有一半画面会异常
-
53536AV100的sample_vdec输出到CVBS显示
-
10海思板子mpp怎么在vi阶段改变视频数据尺寸
-
10HI3559AV100 多摄像头同步模式
-
9海思ss928单路摄像头vio中加入opencv处理并显示
-
10EB-RV1126-BC-191板子运行自己编码的程序
举报反馈
举报类型
- 内容涉黄/赌/毒
- 内容侵权/抄袭
- 政治相关
- 涉嫌广告
- 侮辱谩骂
- 其他
详细说明
提醒
你的问题还没有最佳答案,是否结题,结题后将扣除20%的悬赏金
取消
确认
提醒
你的问题还没有最佳答案,是否结题,结题后将根据回答情况扣除相应悬赏金(1回答=1E币)
取消
确认