精华内容
下载资源
问答
  • //延时100ms等待接收数据 //this.Invoke 跨线程访问ui的方法 this.Invoke((EventHandler)(delegate { if (isHex == false) { tbxRecvData.Text += sp.ReadLine(); } else { Byte[] Received...
  • 功能:接收串口数据,组包成类 “0XFF 0X00 0X01 0X02 0XFF” 的数组,用于主函数解析,包头和包尾都是0XFF,的5元数组 ******************************************************************************/ void ...
  • 接收流程为:等待接收中断—》读取4个fifo数据—》超时检查—》读取fifo剩余数据。这样就会接收完整的一帧数据。 发送流程:触发中断开始发送数据—》写入4个数据到发送fifo----》等到fifo为空中断–

    本文介绍dsp高效接收和发送不定长度的数据,该方法减小cpu的中断次数,经过长时间检验,该方法安全可靠效率最大。我使用的是28034只有4级FIFO,在优化前中断深度设置为1,cpu频繁中断,导致正常程序受影响。经过改进,设置发送中断深度为0级,接收中断为4级,只有在数据发送完成和接收满4个字节中断。
    接收流程为:等待接收中断—》读取4个fifo数据—》超时检查—》读取fifo剩余数据。这样就会接收完整的一帧数据。
    发送流程:触发中断开始发送数据—》写入4个数据到发送fifo----》等到fifo为空中断–》写入下4个数据到fifo----》写入最后剩余数据。
    具体如下:
    (1)初始化配置

    void scia_init()
    {
        // Note: Clocks were turned on to the SCIA peripheral
        // in the InitSysCtrl() function
     	SciaRegs.SCICCR.all =0x0007;   // 1 stop bit,  No loopback
                                       // No parity,8 char bits,
                                       // async mode, idle-line protocol
    	SciaRegs.SCICTL1.all =0x0003;  // enable TX, RX, internal SCICLK,
                                       // Disable RX ERR, SLEEP, TXWAKE
    	SciaRegs.SCICTL2.bit.TXINTENA = 1;//使能发送中断
    
    
    	
    	SciaRegs.SCICTL2.bit.RXBKINTENA = 1;//使能接收中断
    							
    	//BRR = (LSPCLK / (SCI Asynchronous Baud * 8)) - 1 ,LSPCLK=30M, 
    	//BRR = 0x0020, baud=115200
    	//BRR = 0x0007, baud=460800
    	//BRR = 0x0061, baud=38400
        SciaRegs.SCIHBAUD    =0x0000;
        SciaRegs.SCILBAUD    =0x0020;//
    	SciaRegs.SCICCR.bit.LOOPBKENA =0; // Enable loop back
    	SciaRegs.SCICCR.bit.STOPBITS = 2; //
    
        SciaRegs.SCIFFTX.all=0xC020;//设置发送中断为0级
        SciaRegs.SCIFFRX.all=0x0024;//设置接收中断为4级
        SciaRegs.SCIFFCT.all=0x0;
    
    	SciaRegs.SCIPRI.bit.FREE = 0;//仿真模式下是否自由运行
    	SciaRegs.SCICTL1.all =0x0023;     // Relinquish SCI from Reset
    
        SciaRegs.SCIFFTX.bit.TXFIFOXRESET=1;  //发送FIFO复位
        SciaRegs.SCIFFRX.bit.RXFIFORESET=1;   //接收FIFO复位	
    }
    

    (2)接收中断和发送中断

    
    interrupt void SCI1_RXD_isr(void)
    {
    	UINT16 RxData;
    
        //RxData = SciaRegs.SCIRXBUF.all;
    
    	//上一个数据帧应用层未取走,数据丢弃
    	if ((KeyBoardRxFrame.status == UART_FRAME_RX_END) || (KeyBoardRxFrame.index >= 40))
    	{
    		KeyBoardRxFrame.pdata[KeyBoardRxFrame.index++] = SciaRegs.SCIRXBUF.all;
    		KeyBoardRxFrame.pdata[KeyBoardRxFrame.index++] = SciaRegs.SCIRXBUF.all;
    		KeyBoardRxFrame.pdata[KeyBoardRxFrame.index++] = SciaRegs.SCIRXBUF.all;
    		KeyBoardRxFrame.pdata[KeyBoardRxFrame.index++] = SciaRegs.SCIRXBUF.all;
    	}else
    	{
    		KeyBoardRxFrame.pdata[KeyBoardRxFrame.index++] = SciaRegs.SCIRXBUF.all;
    		KeyBoardRxFrame.pdata[KeyBoardRxFrame.index++] = SciaRegs.SCIRXBUF.all;
    		KeyBoardRxFrame.pdata[KeyBoardRxFrame.index++] = SciaRegs.SCIRXBUF.all;
    		KeyBoardRxFrame.pdata[KeyBoardRxFrame.index++] = SciaRegs.SCIRXBUF.all;
    		KeyBoardRxFrame.ticker = KeyBoardRxFrame.spacetime;
    	}
    	
        SciaRegs.SCIFFRX.bit.RXFFOVRCLR=1;   // Clear Overflow flag
        SciaRegs.SCIFFRX.bit.RXFFINTCLR=1;   // Clear Interrupt flag
     
        PieCtrlRegs.PIEACK.all|=0x100;       // Issue PIE ack
    
    }
    
    interrupt void SCI1_TXD_isr(void)
    {
    	Uint16 i;
    	Uint16 len;
    	// 发送一帧数据没有完成
    	if(KeyBoardTxFrame.index + 4 < KeyBoardTxFrame.len) 		 
    	{
    		SciaRegs.SCITXBUF = KeyBoardTxFrame.pdata[KeyBoardTxFrame.index++];
    		SciaRegs.SCITXBUF = KeyBoardTxFrame.pdata[KeyBoardTxFrame.index++];
    		SciaRegs.SCITXBUF = KeyBoardTxFrame.pdata[KeyBoardTxFrame.index++];
    		SciaRegs.SCITXBUF = KeyBoardTxFrame.pdata[KeyBoardTxFrame.index++];
    		
    		SciaRegs.SCIFFTX.bit.TXFFINTCLR=1;  // Clear SCI Interrupt flag清除后产生中断
    	}
    	else 
    	{
    		//发送剩下的数据
    		len = KeyBoardTxFrame.len - KeyBoardTxFrame.index;
    		for(i = 0; (len <= 40) && (i < len); i++)
    		{
    			SciaRegs.SCITXBUF = KeyBoardTxFrame.pdata[KeyBoardTxFrame.index++];
    		}
    		
    		//一帧数据结束
    		if(KeyBoardTxFrame.len)
    		{
    			KeyBoardTxFrame.status = UART_FRAME_TX_IT_END;
    		}
    	 }
    
        PieCtrlRegs.PIEACK.all|=0x100;      // Issue PIE ACK
    }
    
    

    (3)读取不到4个字节的数据

    
    void SCI1_RX_FIFO(UART_FRAME *pFrame)
    {
    	Uint16 maxNum = 0;
    	while(SciaRegs.SCIFFRX.bit.RXFFST && maxNum < 4)
    	{
    		pFrame->pdata[pFrame->index++] = SciaRegs.SCIRXBUF.all;
    		maxNum++;
    	}
    }
    
    

    (4)在应用程序需要2ms周期查询接收数据是否结束

    static void KeyboardJudgeRxFinish(void)
    {
    	//超时或数据长度大于40一帧接收完成
    	if(((KeyBoardRxFrame.ticker <= 0)&&(KeyBoardRxFrame.index > 0)) || KeyBoardRxFrame.index >= 40)
    	{
    		SCI1_RX_FIFO(&KeyBoardRxFrame);
    		KeyBoardRxFrame.len = KeyBoardRxFrame.index;
    		KeyBoardRxFrame.status = UART_FRAME_RX_END;//数据接收完成,应用可以取走数据
    	}
    
    	if(KeyBoardRxFrame.ticker > 0)
    	{
    		KeyBoardRxFrame.ticker--;
    	}
    }
    

    (6)发送

    void KeyboardRs485TxFrame(void)
    {
    	SCI1SetTxMode();
    
    	//如果当前帧正在发送,又重新请求发送一帧数据,则请求的数据丢弃
    	if(KeyBoardTxFrame.status == UART_FRAME_TX_ING)
    	{
    		return ;
    	}
    	//启动发送第一个字节后,产生中断,接着数据在中断中发送完成
    	KeyBoardTxFrame.index = 0;
    	SciaRegs.SCIFFTX.bit.TXFFINTCLR=1;//启动发送中断
    	KeyBoardTxFrame.status = UART_FRAME_TX_ING;
    }
    
    展开全文
  • /* 若接收数据寄存器满,则产生中断 */ USART_ITConfig(USART3, USART_IT_RXNE, ENABLE); /* 第5步:使能 USART3, 配置完毕 */ USART_Cmd(USART3, ENABLE); /* 如下语句解决第1个字节无法正确发送出去的...
  • i++) //接收12位数据 { dat <<= 1; CLK = 1; CLK = 0; dat |= DOUT; } return (u8)(dat>>4); } /**************************************************************************** *...
  • 简单的串口通信

    2021-05-07 18:50:20
    1.Serial.begin(speed):设置电脑与Arduino进行串口通讯时的数据传输速率(每秒传输字节数)。 2.Serial.end():终止串行通讯,让RX 和 TX引脚用于Arduino的输入(INPUT)或输出(OUTPUT)功能。 3.Serial.available...

    简单的串口通信(Serial)

    一、相关函数

    1.Serial.begin(speed):设置电脑与Arduino进行串口通讯时的数据传输速率(每秒传输字节数)。

    2.Serial.end():终止串行通讯,让RX 和 TX引脚用于Arduino的输入(INPUT)或输出(OUTPUT)功能。

    3.Serial.available():可用于检查设备是否接收到数据。该函数将会返回等待读取的数据字节数。

    4.Serial.read():可用于从设备接收到数据中读取一个字节的数据。

    5.Serial.readString():可用于从设备接收到数据中读取数据信息。读取到的信息将以字符串格式返回。

    6.Serial.print(val, format):以人类可读的ASCII码形式向串口发送数据,该函数有多种格式。整数的每一数位将以ASCII码形式发送。浮点数同样以ASCII码形式发送,默认保留小数点后两位。字节型数据将以单个字符形式发送。字符和字符串会以其相应的形式发送。【val: 要发送的数据(任何数据类型);format: 指定数字的基数(用于整型数)或者小数的位数(用于浮点数)。】

    7.Serial.println(val, format):以人类可读的ASCII码形式向串口发送数据,类似print()指令,但是有换行。

    8.while循环:连续地无限地循环,直到圆括号()中的表达式变为假。被测试的表达式变量必须被改变,否则while循环将永远不会中止。【while(表达式/循环条件){语句块/循环体}】

     

     

    二、实践

    1.在串口监视器中输入字符,输出“hello,world"

    String date="";
    void setup(){
      Serial.begin(9600); 
    }
    
    void loop() {
      date="";
      while(Serial.available()>0)
      {
        date+=char(Serial.read());
        delay(2);
      }
      if(date.length()>0)
        {
          Serial.println("hello,world");
        }
    }

    2.通过串口监视器控制LED灯的亮灭

    String date1="";
    int led=7;
    void setup() {
      Serial.begin(9600);
      Serial.println("COM is ready");
      Serial.println("Input Command :");
      pinMode(led,OUTPUT); 
    }
    
    void loop() {
      while(Serial.available()>0)
      {
        date1+=char(Serial.read());
        delay(2);
      }
      if(date1.length()>0)
      {
        if(date1=="open")
        {
          digitalWrite(led,HIGH);
          Serial.println("The lED is opened.");
        }
        else if(date1=="close")
        {
          digitalWrite(led,LOW);
          Serial.println("The LED is closed.");
        }
        else
        {
          Serial.println("ERROR!!!");
        }
      }
    }

    以上就是简单的串口通信,谢谢。

    展开全文
  • // 等待1秒钟让串口数据全部接收后在处理 Thread.sleep(200); } catch (InterruptedException e) { e.printStackTrace(); } switch (serialPortEvent.getEventType()) { case ...
  • //得到此次接收数据的长度 printf("\r\n您发送的数据为:\r\n\r\n"); for(t=0;t;t++) { USART_SendData(USART1, USART_RX_BUF[t]);//向串口发送数据 while(USART_GetFlagStatus(USART1,USART_...
  • using namespace System; using namespace System::ComponentModel; using namespace System::Collections; using namespace System::Windows::Forms;... //串口打开后,相关的串口设置按钮不可再用 ...
  • 1、延时等待 原理:串口发送指令/数据之后,通过...串口接收数据的时候重置倒计时时间,在定时器中递减该时间计数值,如果没有数据收发,时间计数值会减为0,证明数据接收完成,置位接收完成标志。 优点:不需要超..

    1、延时等待

    原理:串口发送指令/数据之后,通过延时函数延时一定时间,等待从机的响应。

    优点:实现简单,对于快速相应和长度不长的通讯可以使用此方法

    缺点:(1)在非实时环境中,由于延时的存在会影响系统的响应效率

    (2)串口在收发不定长度数据时候可能会接受数据不完整

    2、超时接收

    原理:设置一个倒计时标志和接收完成标志,需要开启串口接收中断。串口接收数据的时候重置倒计时时间,在定时器中递减该时间计数值,如果没有数据收发,时间计数值会减为0,证明数据接收完成,置位接收完成标志。

    优点:不需要超时等待,每次只需要检查接收接收完成标志状态即可判断数据是否接收完成

    缺点:需要额外开启一个定时器作,多使用一个外设

    3、空闲中断

    原理:串口接收数据完成之后的一个字节周期内如果没有接收到数据,stm32则会产生一个串口空闲中断,可以利用此终端判定数据接收已经完成

    优点:(1)不需要额外使用定时器,利用串口本身功能即可实现

    (2)可使用DMA进一步降低MCU负载,提示效率

    展开全文
  • using Microsoft.Win32; using System; using System.IO.Ports; using System.Windows.Forms;...using System.Collections.Generic;...//串口接收处理函数 } catch { MessageBox.Show("串口打开失败!"); } ...
  • LPC2138串口中断总结

    2011-12-30 15:50:00
    LPC2138串口中断总结 LPC2138的串口带有16字节的接收和发送FIFO,并且接收FIFO的...而当接收到的字节数未能达到设置的触发点(比如触发点设置为14,但是只接收到了10个字节的数据),那么经过短暂的等待时...

    LPC2138串口中断总结  

          LPC2138的串口带有16字节的接收和发送FIFO,并且接收FIFO的触发点可设为1,4,8,14字节。
          
          1)接收
          当接收到的字节数达到设置的触发点(通过FCR寄存器设置)时,就会产生接收中断;而当接收到的字节数未能达到设置的触发点(比如触发点设置为14,但是只接收到了10个字节的数据),那么经过短暂的等待时间后会产生超时中断。在这两种情况下需要正确读取RBR寄存器,妥善保存接收到的数据。
          举例来说,假设接收FIFO的触发点设置为14,而要接收的数据一共有16字节。那么接收过程中会产生两次中断:第一次是当接收到第14个字节时产生的接收中断;之后只剩2个字节要接收,达不到触发点14,所以经过等待时间后会产生超时中断。
          中断服务程序里,对于这两种中断可进行如下的处理(假设使用UART1):
          switch (U1IIR & 0x0E)
          {
                case 0x0C:            // 若为超时中断(注意此处不要加break)
                case 0x04:            // 若为接收中断
                      while ((U1LSR & 0x01) == 1)             // 若U1RBR包含有效数据
                            Rec_Buffer[index++] = U1RBR;    // 保存接收到的数据
          }
         
          2)发送
          发送FIFO并没有触发点的问题。要发送数据时,首先把数据写入THR寄存器,之后MCU会将其移入发送FIFO缓冲区中,一旦THR寄存器被移空,就会产生发送中断。换句话说,在使能了发送中断的情况下,每向THR寄存器写一个字节就会引起一次发送中断。所以要发送一系列的数据时,只需要发送第一个字节来启动发送过程,剩余的字节由中断服务程序来完成就可以了。
          假设Send_Length为要发送的总字节数,程序中的处理如下:
          U1THR = Txd_Buffer[0];
          index = 1;
         
          void __irq Uart1_isp(void)                           // 中断服务程序
          {
                if ((U1IIR & 0x0E) == 0x02)                   // 判断是否为发送中断
                {
                      if (index != Send_Length)
                      {
                            U1THR = Txd_Buffer[index];
                            index ++;
                      }
                }
          }
          个人觉得,使能发送中断会导致MCU的工作效率变低。因为一旦THR寄存器为空就会进入中断服务程序,会出现连续的无效中断。(如果理解有错误,还请指正)
          在不使能发送中断的情况下,可用查询方式实现以上的发送过程:
          int i;
          for (i = 0; i < Send_Length; i++)
         {
               U1THR = Txd_Buffer[i];
               while (!(U1LSR & 0x20));         // 等待当前字节发送完毕
          }

    转载于:https://www.cnblogs.com/candylakers/archive/2011/12/30/2307599.html

    展开全文
  • UART串口软件接口的设计与分析

    千次阅读 2017-02-22 22:11:08
    (3)发送或接收数据。 (4)检查串口状态字或等待串口中断。 关于串口的操作主要由以下几个函数来实现。 1串口初始化函数UARTInit(uint32_t baudrate) UARTInit函数根据从主程序传递的参数——波特率对串口...
  • stm32 USART接收总线空闲中断--USART_IT_IDLE

    万次阅读 多人点赞 2018-08-10 11:21:08
    串口接收DMA在初始化的时候就处于开启状态,一直等待数据的到来,在软件上无需做任何事情,只要在初始化配置的时候设置好配置就可以了。 判断数据数据接收完成: 这里判断接收完成是通过串口空闲中断的方式实现,...
  • vb 与单片机串口通信程序

    热门讨论 2010-08-11 18:53:47
    InputMode:设置或返回接收数据的类型。 Inputlen:设置或返回一次从接收缓冲区中读取字节数。 InBufferSize:设置或返回接收缓冲区的大小,缺省值为l 024字节。 InBufferCount:设置或返回接收缓冲区中等待计算机...
  • 那么在接收数据时,由于 <code>const rt_uint8_t *buf</code> 指向的是一个只读缓冲区,则无法传入上层接收缓冲区的地址。 - 2、DMA 方式的串口设备读取流程ÿ1f; 我以往的串口设备读取数据的流程是&...
  • 6、支持数据触发模式,当串口(Socket)接收到预定义格式的数据时,可以直接触发脚本内指定的函数事件; 7、支持串口回环模式,发出的数据自动返回,便于脚本调试; 8、支持常用工具嵌入到本界面内部,由脚本定制...
  • 串口程序中的几个函数的联合使用 一、首先是利用WaitCommEvent 来等待串口事件的被触发...函数SetCommMask (ceSeries->m_hComm, EV_RXCHAR |EV_CTS | EV_DSR )设置数据接收中断  2.用户中断线程的操作。  3.
  • (STM32)UART串口程序

    2018-05-12 13:07:22
    //向串口1发送数据 while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待发送结束 } printf("\r\n\r\n");//插入换行 USART_RX_STA=0; }else { times++; if(times 0==0)printf("请输入数据,以回车...
  • CC2530--串口实验的回显

    千次阅读 2014-01-10 17:25:41
    1.串口收发要初始化串口,(设置时钟频率-->选择用来当做串口的IO-->设置波特率-->发送中断设为0-->打开数据接收的中断) 2.字符串发送函数(U0DBUF填充字符-->等待串口发送完毕-->发送中断标志设为0,准备下次发送...
  • SerialMonitor:C#写的串口调试程序

    千次阅读 2012-11-01 09:38:09
    下载地址: 【北方网通】 【电信网通】 【下载说明】 1 点击上面的地址,打开下载页面 2 点击"普通下载"--等待30秒--点击"下载"按钮--保存 ...可以十六进制显示接收的数据,并可以设置接收窗的字体。
  • 设置串口工作波特率、时钟、以及数据位数,起始位、停止位、错误检测等。 (2).准备等待发送/接收响应。 (3).当检测到发送/接收标志的时候,进行发送/接收数据。 程序范例:(中断法接收数据) #pragma vector Uart_...
  • 1.修正接收数据保存不完整的问题。 2.修正程序启动时调用历史设置时失败的问题。 3.添加热键方便调试操作。 4.添加28800bps波特率。 5.将可调试的端口数由4个扩大到32个。 AccessPort 1.10 (2002.11.10) 1.重新设计...
  • 设置串口波特率115200bps,8N1 串口调试助手给CC2530发送字符串,开发板则返回同样字符。 */ #include #include typedef unsigned char uchar; typedef unsigned int uint; #define SIZE 50 char ...
  • 这是我的代码,将之烧入51单片机时,串口通信本来是让led显示,但是可能由于红外遥控的中断函数干扰了串口通信,导致红外遥控工作正常,串口通信无法进行,led无法显示。 #include #include<intrins.h> ...
  •   在串口程序中的几个函数的联合使用 一、首先是利用WaitCommEvent 来等待串口事件的被触发,这些事件是指在该函数被调用前,我们自己设置好的能触发串口线程的有效事件。 主要包括3类事件:...
  • 读线程中,用一个BOOL型的开关变量制造了一个死循环,以便实时接收串口收到的数据。同时,也希望在需要终止该线程的时候,将开关量置反,结束死循环。 已知:读指令函数中,会持续监测串口事件,当检测到有数据时,...
  • //串口1选择定时器1为波特率发生器 TMOD &= 0x0F; //清除定时器1模式位 TMOD |= 0x20; //设定定时器1为8位自动重装方式 TL1 = 0x94; //设定定时初值 TH1 = 0x94; //设定定时器重装值 ET1 = 0; //...
  • 接收缓冲区取一个byte,如不想等待则在调用前检测inbufsign是否为1。 //getline(char idata *line, unsigned char n); 获取一行数据回车结束,必须定义最大输入字符数 //putbyte(char c);放入一个字节到发送缓冲区 ...

空空如也

空空如也

1 2 3 4 5
收藏数 93
精华内容 37
关键字:

串口1设置接收数据等待