技术标签: 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();
}
最近一个学姐发给我了一份CrackMe希望我解一下,其中涉及到了MFC的消息函数查找的问题,就顺便以此为例谈一下自己使用的消息函数查找的方法。本人萌新,如果有任何错漏与解释不清的地方,欢迎各路大佬指正。这个CrackMe是一个典型的MFC类型的程序,其框体如下:一、目标以及方法首先我们确认我们的目标是找到两个”注册”按钮的对应消息处理函数,那么有什么手段可以达到我们的目标?在MFC...
起因:目前Android 的jar 包我们都是 通过Android studio 的gradle 中添加依赖进行下载。但是eclipse 的用户表示,你在说什么? 读者可能会有疑问,现在还有eclipse 开发Android 的么?有今天我遇到一个有这个需求的朋友。前两个问题还好说,看到第三个,我陷入了沉思,百度不**有得事么。这个人石乐志吧。他说要官方的。我就开始找官方的下载库,没准以后能用上呢...
dir(“地址\”)返回该地址下的第一个文件的文件名Sub t()Dim sr As Stringsr = Dir("G:\社团、活动\JMR\*.xlsx")这里使用了通配符,并指定了文件扩展名;如果不指定,至少应当在地址后加 \ ,以实现遍历DoMsgBox srsr = DirLoop Until sr = ""End Sub使用do
一、获取html元素getElemnetById('id')、getElementsByName('name')、getElementsByTagName('span')。(IE[6-10]、FF、Chrome) 1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta ...
向已有的TreeViewer和TableViewer上添加编辑功能,可以使用CellEditor和CellModifier。CellEditor定义了某个列被编辑时显示的外观,它可以是文本框、下拉列表框或单选框,也可以自己定义。通常使用的CellEditor的子类就是:CheckboxCellEditor、ComboBoxCellEditor和TextCellEditor。CellEd
问题在 vue2 中对表单控件有着良好的双向数据绑定机制,但是对于要特定实现某些功能的输入时,我们就不得不使用到 contenteditable="true" 的 div ,而在这个 div 上是使用 v-model 是没有效果的。那么问题就来了,输入是非常需要双向绑定的,这里的双向数据绑定该如何实现?解决思路一:自定义指令当然,说...
在一个GUI程序里,布局是非常重要的。布局的作用是管理应用中的控件在窗体上的摆放位置,以及控件本身的大小尺寸。PyQt5支持三种布局:绝对布局、盒布局、网格布局。1、绝对布局 在窗口上是以像素单位设置尺寸和位置的,所以可以用绝对定位的方式确定控件的尺寸,以及控件在窗口上的位置。本例中,窗口放置三个QLabel控件,并通过绝对布局让这三个QLabel控件在不同的位置显示。实例如下:...
这是第一次参加ccf考试,当时考场上只得了50分,思路有点不清晰,回来整理了一下思路其实考试题目都给了思路了我的思路就是一个结构体,记录IP地址四段中的每一段的大小,还有一个len记录IP地址的长度排序操作使用sort函数自动从小到大合并使用另一个list来存储统计合并就像进栈出栈一样其实这两个我都想用list直接删除的好,但并不会这种操作下面是满分代码,附带了两个...
尽管 Qt 已经提供了很多事件,但对于更加千变万化的需求来说,有限的事件都是不够的。例如,我要支持一种新的设备,这个设备提供一种崭新的交互方式,那么,这种事件如何处理呢?所以,允许创建自己的事件 类型也就势在必行。即便是不说那种非常极端的例子,在多线程的程序中,自定义事件也是尤其有用。当然,事件也并不是局限在多线程中,它可以用在单线程的程序中,作为一种对象间通讯的机制。那么,为什么我需要使用事件,
一、题目描述二、题解方法一:spfa思路题中没有说边权是多少,所以我们可以认为设定每个结点之间的边权 w 为一个常数,进而简化问题。设定一个 int[] cnt 来记录到达每个点的最短路的个数。如果 dist[to] > dist[u] + w,意味着从 1 到 to 的最短路的比 1 到 v 的长,所以此时 cnt[to] 的计数是不算入内的,又因为 to 可看做是 v ...
# 欢迎使用 Markdown在线编辑器 MdEditor**Markdown是一种轻量级的「标记语言」**Markdown是一种可以使用普通文本编辑器编写的标记语言,通过简单的标记语法,它可以使普通文本内...