日夏养花网

您好,欢迎访问日夏养花网,我们的网址是:http://www.rixia.cc

单片机串口通信,发送一次数据单接收的是很多重复的数据,请大虾们帮忙解决这个问题

2021-01-19 07:59:14 分类:养花问答 来源: 日夏养花网 作者: 网络整理 阅读:161

VC中读取串口数据问题 WaitCommEvent一直返回0,代码如下,请大虾们帮忙。

UINT CommThread(LPVOID pParam)rn{rn CSerialPort *port = (CSerialPort*)pParam;rn port->m_bThreadAlive = TRUE; rn DWORD BytesTransfered = 0;rn DWORD Event = 0;rn DWORD CommEvent = 0;rn DWORD dwError = 0;rn COMSTAT comstat;rn BOOL bResult = TRUE;rn if (port->m_hComm) rn PurgeComm(port->m_hComm, PURGE_RXCLEAR | PURGE_TXCLEAR | PU日夏养花网RGE_RXABORT | PURGE_TXABORT);rn for (;;)rn {rn bResult = WaitCommEvent(port->m_hComm, &Event, &port->m_ov);//这里一直返回0,从而导致下面一直处于等待,请大虾们指点下,到底是怎么回事rn if (!bResult) rn {rn switch (dwError = GetLastError())rn {rn case ERROR_IO_PENDING: rn {rn //GetOverlappedResult(port->m_hComm,&port->m_ov,&BytesTransfered,TRUE);rn break;rn }rn case 87:rn {rn break;rn }rn default:rn {rn port->ProcessErrorMessage("WaitCommEvent()");rn break;rn }rn }rn }rn elsern {rnrn bResult = ClearCommError(port->m_hComm, &dwError, &comstat);rn if (comstat.cbInQue == 0)rn continue;rn } // end if bResultrn Event = WaitForMultipleObjects(3, port->m_hEventArray, FALSE, INFINITE);rn switch (Event)rn {rn case 0:rn {rn port->m_bThreadAlive = FALSE;rnrn // Kill this thread. break is not needed, but makes me feel better.rn AfxEndThread(100);rn break;rn }rn case 1: // read eventrn {rn GetCommMask(port->m_hComm, &CommEvent);rn if (CommEvent & EV_CTS)rn ::SendMessage(port->m_pOwner->m_hWnd, WM_COMM_CTS_DETECTED, (WPARAM) 0, (LPARAM) port->m_nPortNr);rn if (CommEvent & EV_RXFLAG)rn ::SendMessage(port->m_pOwner->m_hWnd, WM_COMM_RXFLAG_DETECTED, (WPARAM) 0, (LPARAM) port->m_nPortNr);rn if (CommEvent & EV_BREAK)rn ::SendMessage(port->m_pOwner->m_hWnd, WM_COMM_BREAK_DETECTED, (WPARAM) 0, (LPARAM) port->m_nPortNr);rn if (CommEvent & EV_ERR)rn ::SendMessage(port->m_pOwner->m_hWnd, WM_COMM_ERR_DETECTED, (WPARAM) 0, (LPARAM) port->m_nPortNr);rn if (CommEvent & EV_RING)rn ::SendMessage(port->m_pOwner->m_hWnd, WM_COMM_RING_DETECTED, (WPARAM) 0, (LPARAM) port->m_nPortNr);rnrn if (CommEvent & EV_RXCHAR)rn // Receive character event from port.rn ReceiveChar(port, comstat);rnrn break;rn } rn case 2: // write eventrn {rn // Write character event from portrn WriteChar(port);rn break;rn }rn } // end switchrn } // close forever looprn return 0;rn}rn麻烦各位帮忙看下,我是用来读取条码枪数据的,但是一直读不到,我用控件的方式可以正确读取。
你这里使用了异步方式读取,ERROR_IO_PENDING返回值时可以用等待函数等port->m_ov中事件变成有信号状态,http://www.rixia.cc要么你就直接用同步串口方式读取。

有关于单片机数据移位的问题,希望大虾们可以帮帮忙啊!!!小弟感激不尽啊。。。

一个整型变量PP里面有一个10位的二进制数,我现在想把这个10位的二进制数的最高位发送给单片机的P1管脚的最高位P1.7,10位数据的次高位发送给单片机管脚的次高位P1.6,以此类推,要把10位数据依次发送给P1管脚的P1.7到P1.3管脚上,请问怎么弄,还请大虾们多多帮忙啊,谢谢啦!!!!
sbit P1_7=P1^7;//需要先声明各个位引脚,因为C语言不能直接给P1.7幅值
sbit P1_6=P1^6;
sbit P1_5=P1^5;
sbit P1_4=P1^4;
sbit P1_3=P1^3;

pp=pp<<6; //整型变量16位,移动版6位,让最高位到权D15位置
if(pp&0x8000) P1_7=1; //最高位幅值给P1.7
else P1_7=0;

pp=pp<<1; //左移一位,让次高位到最高位位置
if(pp&0x8000) P1_6=1; //次高位赋值给P1.6
else P1_6=0;

pp=pp<<1; //左移一位,让次高位到最高位位置
if(pp&0x8000) P1_5=1; //依次类推P1_5,P1_4.......
else P1_5=0;

pp=pp<<1; //左移一位,让次高位到最高位位置
if(pp&0x8000) P1_4=1; //依次类推P1_4.......
else P1_4=0;

pp=pp<<1; //左移一位,让次高位到最高位位置
if(pp&0x8000) P1_3=1; //依次类推P1_3.......
else P1_3=0;

}
10位整形变量是0000 00AB CDEF GHIJ。根据你的题目,为了能快速处理,可以这样:专
先右移2位变成:0000 0000 ABCD EFGH
这时取低字节,即属ABCD EFGH
屏蔽掉低三位,即ABCD E000,将其赋值日夏养花网到P1口即可,所以程序这样写(假设变量为x)
P1=(x>>2)&0xF8;
这样完成了高5位的输出。
低于低5位的输出,则将变量左移3位,即000A BCDE FGHI J000,然后NmEFrl取低字节(FGHI J000)输出到P1即可,所以程序是:
P1=(x<<3)&0xF8;
说明:PP是一个bai10位的二进制du数,说是是双字节的日夏养花网。zhi
void MoveBit(void){
unsigned int pp=0x0355;//xxxx-xx11-0101-0101
unsigned char high_5bits;//高5位
unsigned char low_5bits;//低5位
unsigned char temp=0;
high_5bits=(unsigned char)(pp>>2);//取高5位:daoxxxx-x000
low_5bits=(unsigned char)pp;//取低专5位:000x-xxxx
//先送高5位
temp=P1;
temp|=high_5bits&0xF8;
P1=temp;
//注:属此地方用户需要加入延时或其它处理。

//后送低5位
temp=P1;
temp|=low_5bits&0x1F;
P1=temp;
}

此函数可以在KEIL/IAR/VC所有C编译环境都能实现。
P1=(10位二进制数>>2)&0x00F0;//将高5位赋给P1
P1=10位二进制数&0x000F;//将低5位赋给P1

其中0x00F0的长度根据你单片机整型变量的长度可以适当修改

stc单片机串口调试的小程序,但是在串口调试助手里,显示接收不到数据,希望大虾们帮忙解决下,下面是程序

ORG 0000Hrn LJMP MAINrn ORG 1000Hrn MAIN: MOV P1,#0FFH rn MOV P2,#0FFH rn MOV TMOD,#20H ;设置波特率为9600,串口发送方式为1rn MOV TH1,#0FBH rn MOV TL1,#0FBHrn MOV PCON,#00Hrn MOV SCON,#58Hrn SETB TR1 rn SETB EA ;开中断rn SETB ES rnSEND: MOV A,#0FFHrn MOV SBUF,Arn JBC TI,SENDrn END
你先看看bai串口线有没问题:

将串口du的zhi2、3脚两根针短dao接,用键盘在串口调试输入字符回,如果串口调试接收答区能够显示输入的字符,说明串口工作正常
等我再看看程序

我觉得这儿有问题 JBC TI,SEND
JBC在T1为0的时候,会顺序执行,然后就end了 ,这里我觉得应该改为等待发送结束的指令

JNB T1, $
用十六进制发送
大哥,啥年代啦,还用汇编。我汇编看不太懂,你调用send了吗。你如果要C语言的,我能给你写个

webapi怎么接收一个list类型的数据.大虾们help

post体内容为序列化后的json串,在后台使用JArray接收。
解决。

文章标签:

本文标题: 单片机串口通信,发送一次数据单接收的是很多重复的数据,请大虾们帮忙解决这个问题
本文地址: http://www.rixia.cc/wenda/82659.html

上一篇:今日入伏,三伏天是30天的多,还是40天的多?

下一篇:睡莲不用泥土能活吗

相关推荐

推荐阅读

猜你喜欢

返回顶部