广州嵌入式培训班的小编这一期给大家讲linux C之getchar()非阻塞方式。
#include
"../include/CommUart.h"
#include
"ComCommon.h"
#include
#include
#include
#include
#include
#include
#include
#include
using namespace
std;
#define
USR_DEBUG
static struct
termios 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;
struct timeval tv;
int retval;
/* 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初始化
int tty_set_flag;
tty_set_flag = tty_set();
char com_num[3] = {0};
if (argc < 2) {
printf("please enter com
um:\n");
scanf("%c", &com_num);
} else {
// com_num = *argv[1];
strcpy(com_num, argv[1]);
}
#ifdef USR_DEBUG
printf("main entry\n");
#endif //
USR_DEBUG
CComCommon *m_pComUart = new CCommUart;
#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, "
detected>\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();
}
了解详情请登陆广州达内嵌入式培训官网(gz.arm.tedu.cn)!