21,597
社区成员
发帖
与我相关
我的任务
分享
while(1){
printf("请输入控制命令(1-来打招呼,2-接受数据,3-走打招呼):");
scanf("%d", &num);
if (num == 1){
serSend(fd, str1, 1);
memset(str, 0, sizeof(str));
/*while (serRev(fd, &ch, 1) > 0);
printf("%c",ch);
serSend(fd, str1, 1);*/
lseek(fd,0,SEEK_SET);
while ((len = serRev(fd, str, 17)) == 0);
printf("\nRecvLen %d",len);
str[len]='\0';
printf("\nRecv:%s\n", str);
}
else if (num == 2){
serSend(fd, str2, 1);
memset(str, 0, sizeof(str));
serRev(fd, str, 4);
printf("\nRecv:%s\n", str);
}
else if (num == 3){
serSend(fd, str3, 1);
memset(str, 0, sizeof(str));
lseek(fd,0,SEEK_SET);
while (serRev(fd, str, 8) == 0);
printf("\nRecv:%s\n", str);
}
memset(str, 0, sizeof(str));
}
void InitUART(){
SCON = 0x50;
TMOD |= 0x20;
TH1 = 0xF3;
TR1 = 1;
}
void WaterInit(){
TMOD |= 0x05;
TH0=0;
TL0=0;
TR0=1;
}
void main (void)
{
uchar str[6], A = 0;
InitUART();
WaterInit();
EA = 1;
while (TI == 0)
{
while(RI == 0){
num = 256 * TH0 + TL0;
ISR();
Display(Qian,Bai,Shi,Ge);
}
if (SBUF == 'B'){
sprintf(str,"%u",num);
SendStr(str);
TR0 = 1;
}
else if(SBUF == 'A'){
if (A == 0){
SendByte('@');
TR0 = 1;
A = 1;
}
else if (A == 1){
SendStr("Welcome to water!");
TR0 = 1;
A = 0;
}
}
else if(SBUF == 'C'){
SendStr("GoodBye!");
A = 0;
TR0 = 1;
}
RI = 0;
}
}
/*------------------------------------------------
发送一个字节
------------------------------------------------*/
void SendByte(unsigned char dat)
{
SBUF = dat;
while(!TI);
TI = 0;
}
/*------------------------------------------------
发送一个字符串
------------------------------------------------*/
void SendStr(unsigned char *s){
while(*s!='\0'){// \0 表示字符串结束标志,
//通过检测是否字符串末尾
SendByte(*s);
s++;
}
}
printf("请输入控制命令(1-来打招呼,2-接受数据,3-走打招呼):");
scanf("%d", &num);
if (num == 1){
serSend(fd, &str1, 1);
process(fd);
}
else if (num == 2){
serSend(fd, &str2, 1);
process(fd);
}
else if (num == 3){
serSend(fd, &str3, 1);
process(fd);
}
调用[/quote]
子线程只要创建一个就可以了,在main函数里调用一次pthread_create即可。
线程里应是死循环来接收串口数据的,不要随便退出.[/quote]
void* recv_func(void *args)
{
unsigned char str[100];
int fd = *(int*)args;
int len = 0;
while(1){
memset(str, 0, sizeof(str));
while ((len = serRev(fd, str, 30)) <= 0){}
printf("\nRecvLen:%d",len);
str[len]='\0';
printf("\nRecv:%s\n", str);
}
/*pthread_exit(NULL);
return;*/
}
我线程改成这样了,main只调用了一次, 但是收不到数据了,,判断是否接收到数据是这样判断吗?[/quote]
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <termios.h>
#include <pthread.h>
void *thread_func(void *arg)
{
int fd = *(int *)arg;
char data[100];
int ret;
while (1)
{
ret = read(0, data, sizeof(data));
if (ret > 0)
{
data[ret-1] = '\r';
write(fd, data, ret);
}
}
return NULL;
}
int main(int argc, char *argv[])
{
int fd;
fd = open(argv[1], O_RDWR|O_NOCTTY|O_NONBLOCK);
if (fd < 0)
{
perror("open");
return 1;
}
fcntl(fd, F_SETFL, 0);
struct termios opts;
tcgetattr(fd, &opts);
cfsetispeed(&opts, B115200);
cfsetospeed(&opts, B115200);
opts.c_cflag |= CREAD|CLOCAL;
opts.c_cflag &= ~CSIZE;
opts.c_cflag |= CS8;
opts.c_cflag &= ~PARENB;
opts.c_cflag &= ~CSTOPB;
opts.c_cflag &= ~CRTSCTS;
opts.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);
opts.c_oflag &= ~OPOST;
tcsetattr(fd,TCSANOW , &opts);
/////////////
pthread_t tid;
pthread_create(&tid, NULL, thread_func, &fd);
int ret;
char ch;
while (1)
{
read(fd, &ch, 1);
putchar(ch);
}
return 0;
}
你参考下printf("请输入控制命令(1-来打招呼,2-接受数据,3-走打招呼):");
scanf("%d", &num);
if (num == 1){
serSend(fd, &str1, 1);
process(fd);
}
else if (num == 2){
serSend(fd, &str2, 1);
process(fd);
}
else if (num == 3){
serSend(fd, &str3, 1);
process(fd);
}
调用[/quote]
子线程只要创建一个就可以了,在main函数里调用一次pthread_create即可。
线程里应是死循环来接收串口数据的,不要随便退出.[/quote]
void* recv_func(void *args)
{
unsigned char str[100];
int fd = *(int*)args;
int len = 0;
while(1){
memset(str, 0, sizeof(str));
while ((len = serRev(fd, str, 30)) <= 0){}
printf("\nRecvLen:%d",len);
str[len]='\0';
printf("\nRecv:%s\n", str);
}
/*pthread_exit(NULL);
return;*/
}
我线程改成这样了,main只调用了一次, 但是收不到数据了,,判断是否接收到数据是这样判断吗?printf("请输入控制命令(1-来打招呼,2-接受数据,3-走打招呼):");
scanf("%d", &num);
if (num == 1){
serSend(fd, &str1, 1);
process(fd);
}
else if (num == 2){
serSend(fd, &str2, 1);
process(fd);
}
else if (num == 3){
serSend(fd, &str3, 1);
process(fd);
}
调用[/quote]
子线程只要创建一个就可以了,在main函数里调用一次pthread_create即可。
线程里应是死循环来接收串口数据的,不要随便退出.printf("请输入控制命令(1-来打招呼,2-接受数据,3-走打招呼):");
scanf("%d", &num);
if (num == 1){
serSend(fd, &str1, 1);
process(fd);
}
else if (num == 2){
serSend(fd, &str2, 1);
process(fd);
}
else if (num == 3){
serSend(fd, &str3, 1);
process(fd);
}
调用void* recv_func(void *args)
{
unsigned char str[100];
int fd = *(int*)args;
int len;
memset(str, 0, sizeof(str));
while ((len = serRev(fd, str, 30)) <= 0){}
printf("\nRecvLen:%d",len);
str[len]='\0';
printf("\nRecv:%s\n", str);
pthread_exit(NULL);
return;
}
void process(int fd)
{
pthread_t td;
int res;
res = pthread_create(&td, NULL, recv_func, (void*)&fd);
if(res != 0){
printf ("Create pthread error!\n");
exit (1);
}
pthread_join(td, NULL);
return;
}