c语言 linux scanf非阻塞输入,linux C之getchar()非阻塞方式_兜兜船长的博客-程序员宅基地

技术标签: c语言 linux scanf非阻塞输入  

#include "../include/CommUart.h"#include"ComCommon.h"#include#include#include#include#include#include#include#include

using namespacestd;#define USR_DEBUG

static structtermios ori_attr, cur_attr;static __inline int tty_reset(void)

{if (tcsetattr(STDIN_FILENO, TCSANOW, &ori_attr) != 0)return -1;return 0;

}static __inline int tty_set(void)

{if ( tcgetattr(STDIN_FILENO, &ori_attr) )return -1;

memcpy(&cur_attr, &ori_attr, sizeof(cur_attr) );

cur_attr.c_lflag&= ~ICANON;//cur_attr.c_lflag |= ECHO;

cur_attr.c_lflag &= ~ECHO;

cur_attr.c_cc[VMIN]= 1;

cur_attr.c_cc[VTIME]= 0;if (tcsetattr(STDIN_FILENO, TCSANOW, &cur_attr) != 0)return -1;return 0;

}static __inline int kbhit(void)

{

fd_set rfds;structtimeval tv;intretval;/*Watch stdin (fd 0) to see when it has input.*/FD_ZERO(&rfds);

FD_SET(0, &rfds);/*Wait up to five seconds.*/tv.tv_sec= 0;

tv.tv_usec= 0;

retval= select(1, &rfds, NULL, NULL, &tv);/*Don‘t rely on the value of tv now!*/

if (retval == -1) {

perror("select()");return 0;

}else if(retval)return 1;/*FD_ISSET(0, &rfds) will be true.*/

else

return 0;return 0;

}int main(int argc, char*argv[]) {//非阻塞getChar初始化

inttty_set_flag;

tty_set_flag=tty_set();char com_num[3] = {0};if (argc < 2) {

printf("please enter com num:\n");

scanf("%c", &com_num);

}else{//com_num = *argv[1];

strcpy(com_num, argv[1]);

}

#ifdef USR_DEBUG

printf("main entry\n");#endif //USR_DEBUGCComCommon*m_pComUart = newCCommUart;

#ifdef USR_DEBUG

printf("create CCommUart\n");#endif //USR_DEBUG

char sendStr[256] = {0};

strcpy(sendStr,"/dev/ttyS100");

strcat(sendStr, com_num);

strcat(sendStr,",115200,8,1,n");//m_pComUart->InitComComm("/dev/ttyS1001,115200,8,1,n");

m_pComUart->InitComComm(sendStr);//strcat(sendStr,"kkkkkkkkkkkkkkkkkk");//写入文件

FILE*pFile;char fileName[124] = {0};

sprintf(fileName,"readData_dir/%s.txt",com_num);

pFile= fopen (fileName, "w");char Rbuff[256] = {0};int nsize = 0;int i = 0;int nCnt = 0;while (1) {/*********************发送测试*******************************/

//m_pComUart->SendBuff(buff,sizeof(buff));//m_pComUart->SendStr("1234567887654321abcdefgh");//m_pComUart->SendStr("kkkkkkkkkkkkkkkkkk");

if(kbhit()) {const int key =getchar();//printf("%c pressed\n", key);

if (key == ‘q‘)break;

}/*else {

fprintf(stderr, "\n");

}*/

/*********************接收的测试案例*************************/memset(Rbuff,0, 256);

nsize= m_pComUart->GetData(Rbuff, 256, 1000);if (nsize > 0)

{

printf("nsize:%d\n", nsize);//if(nCnt==10){

for (i = 0; i < nsize; i++)

{//printf("%02x ", (unsigned char)Rbuff[i]);

fprintf(pFile,"%02x", (unsigned char)Rbuff[i]);if (nCnt == 7) {

fprintf(pFile,"\n");

nCnt= 0;

}else{

nCnt++;

}

}//二进制输入//fwrite (Rbuff , sizeof(char), sizeof(Rbuff), pFile);//nCnt = 0;//}else{//nCnt++;//}

printf("\n");//printf("%s\n", Rbuff);

}//printf("rec buff data:%s\n", Rbuff);//printf("get char: %d\n", m_pComUart->GetChar(10));//sleep(1);//usleep(1000);

}

delete m_pComUart;

fclose (pFile);//线程的操作

if (tty_set_flag == 0)

tty_reset();

}

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_33910305/article/details/116872475

智能推荐

浅谈MFC类CrackMe中消息处理函数查找方法_weixin_30755709的博客-程序员宅基地

最近一个学姐发给我了一份CrackMe希望我解一下,其中涉及到了MFC的消息函数查找的问题,就顺便以此为例谈一下自己使用的消息函数查找的方法。本人萌新,如果有任何错漏与解释不清的地方,欢迎各路大佬指正。这个CrackMe是一个典型的MFC类型的程序,其框体如下:一、目标以及方法首先我们确认我们的目标是找到两个”注册”按钮的对应消息处理函数,那么有什么手段可以达到我们的目标?在MFC...

android 官方jar,Android 依赖中的jar 包获取方式_全能鬼才木希的博客-程序员宅基地

起因:目前Android 的jar 包我们都是 通过Android studio 的gradle 中添加依赖进行下载。但是eclipse 的用户表示,你在说什么? 读者可能会有疑问,现在还有eclipse 开发Android 的么?有今天我遇到一个有这个需求的朋友。前两个问题还好说,看到第三个,我陷入了沉思,百度不**有得事么。这个人石乐志吧。他说要官方的。我就开始找官方的下载库,没准以后能用上呢...

dir函数:遍历文件名_ainizhongguoaa的博客-程序员宅基地

dir(“地址\”)返回该地址下的第一个文件的文件名Sub t()Dim sr As Stringsr = Dir("G:\社团、活动\JMR\*.xlsx")这里使用了通配符,并指定了文件扩展名;如果不指定,至少应当在地址后加 \ ,以实现遍历DoMsgBox srsr = DirLoop Until sr = ""End Sub使用do

js操作DOM常用方法_weixin_30292745的博客-程序员宅基地

一、获取html元素getElemnetById('id')、getElementsByName('name')、getElementsByTagName('span')。(IE[6-10]、FF、Chrome) 1 &lt;!DOCTYPE html&gt; 2 &lt;html&gt; 3 &lt;head&gt; 4 &lt;meta ...

JFace 可编辑的TreeViewer和TableViewer _溺水的鱼的博客-程序员宅基地

向已有的TreeViewer和TableViewer上添加编辑功能,可以使用CellEditor和CellModifier。CellEditor定义了某个列被编辑时显示的外观,它可以是文本框、下拉列表框或单选框,也可以自己定义。通常使用的CellEditor的子类就是:CheckboxCellEditor、ComboBoxCellEditor和TextCellEditor。CellEd

随便推点

vue2 实现 div contenteditable="true" 类似于 v-model 的效果_weixin_34088598的博客-程序员宅基地

问题在 vue2 中对表单控件有着良好的双向数据绑定机制,但是对于要特定实现某些功能的输入时,我们就不得不使用到 contenteditable="true" 的 div ,而在这个 div 上是使用 v-model 是没有效果的。那么问题就来了,输入是非常需要双向绑定的,这里的双向数据绑定该如何实现?解决思路一:自定义指令当然,说...

PyQt5:布局_weixin_33840661的博客-程序员宅基地

  在一个GUI程序里,布局是非常重要的。布局的作用是管理应用中的控件在窗体上的摆放位置,以及控件本身的大小尺寸。PyQt5支持三种布局:绝对布局、盒布局、网格布局。1、绝对布局  在窗口上是以像素单位设置尺寸和位置的,所以可以用绝对定位的方式确定控件的尺寸,以及控件在窗口上的位置。本例中,窗口放置三个QLabel控件,并通过绝对布局让这三个QLabel控件在不同的位置显示。实例如下:...

ccf 2018-12-3 CIDR合并_ghost889的博客-程序员宅基地

这是第一次参加ccf考试,当时考场上只得了50分,思路有点不清晰,回来整理了一下思路其实考试题目都给了思路了我的思路就是一个结构体,记录IP地址四段中的每一段的大小,还有一个len记录IP地址的长度排序操作使用sort函数自动从小到大合并使用另一个list来存储统计合并就像进栈出栈一样其实这两个我都想用list直接删除的好,但并不会这种操作下面是满分代码,附带了两个...

Qt 学习之路 2(23):自定义事件_亭台六七座的博客-程序员宅基地

尽管 Qt 已经提供了很多事件,但对于更加千变万化的需求来说,有限的事件都是不够的。例如,我要支持一种新的设备,这个设备提供一种崭新的交互方式,那么,这种事件如何处理呢?所以,允许创建自己的事件 类型也就势在必行。即便是不说那种非常极端的例子,在多线程的程序中,自定义事件也是尤其有用。当然,事件也并不是局限在多线程中,它可以用在单线程的程序中,作为一种对象间通讯的机制。那么,为什么我需要使用事件,

【图论】C009_AW_最短路计数 & 紧急情况(路径计数)_wdt_的博客-程序员宅基地

一、题目描述二、题解方法一:spfa思路题中没有说边权是多少,所以我们可以认为设定每个结点之间的边权 w 为一个常数,进而简化问题。设定一个 int[] cnt 来记录到达每个点的最短路的个数。如果 dist[to] &gt; dist[u] + w,意味着从 1 到 to 的最短路的比 1 到 v 的长,所以此时 cnt[to] 的计数是不算入内的,又因为 to 可看做是 v ...

MarkDown_weixin_30483013的博客-程序员宅基地

# 欢迎使用 Markdown在线编辑器 MdEditor**Markdown是一种轻量级的「标记语言」**![markdown](https://www.mdeditor.com/images/logos/markdown.png "markdown")Markdown是一种可以使用普通文本编辑器编写的标记语言,通过简单的标记语法,它可以使普通文本内...

推荐文章

热门文章

相关标签