c语言 linux scanf非阻塞输入,linux C之getchar()非阻塞方式

本文档展示了如何使用C++实现非阻塞式的UART串口通信,包括初始化设置、发送数据和接收数据的处理。通过`tcsetattr`、`select`等函数进行串口配置,并提供了键盘输入检测的实现。程序会读取串口数据并写入到指定文件中,方便调试和分析。
摘要由CSDN通过智能技术生成

#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();

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值