精华内容
下载资源
问答
  • [MSSQL]设置标志实现对比数据

    千次阅读 2008-11-25 16:44:00
    /*  *通常遇到新旧行的比较.比如做采购变更单  *但是如果是删除呢?... *遇到删除标志,只有一行,设置插入标志,插入  */ CREATE procedure UF_Rpt_PoitemchgSp( @Startingpo_num PoNumType=NULL, --nvarchar(1

    /*
     *通常遇到新旧行的比较.比如做采购变更单
     *但是如果是删除呢?如何处理?
     *方法:采用标志,首先保存第一行(旧资料),然后设置插入的变量的条件值
     *遇到删除标志,只有一行,设置插入标志,插入
     */

    CREATE procedure UF_Rpt_PoitemchgSp(
    @Startingpo_num      PoNumType=NULL, --nvarchar(10)
    @Endingpo_num        PoNumType=NULL, --nvarchar(10)
    @Startingpo_line     PoLineType=NULL,--smallint(2)
    @Endingpo_line       PoLineType=NULL, --smallint(2)
    @Startingchg_num     ChgNumType=NULL,--int(4)
    @Endingchg_num       ChgNumType=NULL,--int(4)
    @StartingRecordDate   datetime =NULL,
    @EndingRecordDate     datetime=NULL,
    @StartingVend_num    nvarchar(10)=NULL, --nvarchar(10)
    @EndingVend_num      nvarchar(10)=NULL  --nvarchar(10)
    )
    AS

    declare @ReportSet table(
             Vend_num     nvarchar(7)
     ,Po_num       nvarchar(10)
     ,Chg_num      int
     ,Po_line      smallint
     ,Po_release   smallint
     ,Seq          smallint
     ,Olditem      nvarchar(30)
     ,Newitem      nvarchar(30)
     ,Oldstat      nchar(1)
     ,Newstat      nchar(1) 
     ,Oldduedate   datetime
     ,Newduedate   datetime
            ,Oldvend_item nvarchar(30)
            ,Newvend_item nvarchar(30)
            ,Oldqty_ordered_conv  decimal
            ,Newqty_ordered_conv  decimal
            ,Oldu_m       nvarchar(3)
     ,Newu_m       nvarchar(3)
     ,RecordDate   datetime
     ,UpdatedBy    nvarchar(30)
            ,action_code  nvarchar(1)    
    )
    declare
      @Vend_num     nvarchar(7)
     ,@Po_num       nvarchar(10)
     ,@Chg_num      int
     ,@Po_line      smallint
     ,@Po_release   smallint
     ,@Seq          smallint
     ,@Olditem      nvarchar(30)
     ,@Newitem      nvarchar(30)
     ,@Oldstat      nchar(1)
     ,@Newstat      nchar(1) 
     ,@Oldduedate   datetime
     ,@Newduedate   datetime
            ,@Oldvend_item    nvarchar(30)
            ,@Newvend_item    nvarchar(30)
            ,@Oldqty_ordered_conv decimal
     ,@Newqty_ordered_conv decimal
            ,@Oldu_m          nvarchar(3)
     ,@Newu_m          nvarchar(3)
     ,@RecordDate   datetime
     ,@UpdatedBy    nvarchar(30)
     ,@action_code  nvarchar(1)
    Declare MyCursor1 CURSOR
    local static FOR SELECT p.vend_num,pc.po_num,pc.chg_num,pc.po_line,pc.po_release,pc.sequence,pc.item,pc.stat,pc.due_date,pc.vend_item,pc.qty_ordered_conv,pc.u_m,pc.RecordDate,pc.UpdatedBy,pc.action_code
                          from
                               poitmchg pc left outer join po p on pc.po_num=p.po_num
     
            where pc.action_code <>'A'
       and ltrim(pc.po_num)>=ltrim(ISNULL(@Startingpo_num,pc.po_num)) AND ltrim(pc.po_num)<=ltrim(ISNULL(@Endingpo_num,pc.po_num))--去掉空格
                            AND rtrim(pc.chg_num)>=rtrim(ISNULL(@Startingchg_num ,pc.chg_num)) AND rtrim(pc.chg_num)<=rtrim(ISNULL(@Endingchg_num ,pc.chg_num))--增加变更单号删选条件
        AND pc.po_num<=ISNULL(@Endingpo_num,pc.po_num)
                            AND pc.RecordDate>=ISNULL(convert(datetime,@StartingRecordDate),pc.RecordDate)
                            AND pc.RecordDate<=ISNULL(convert(datetime,@EndingRecordDate),pc.RecordDate)
       AND pc.po_line>=ISNULL(@Startingpo_line,pc.po_line)
                            AND pc.po_line<=ISNULL(@Endingpo_line,pc.po_line)
                            AND p.vend_num>=ISNULL(@StartingVend_num,p.vend_num) AND p.vend_num<=ISNULL(@EndingVend_num,p.vend_num);
    Open MyCursor1
    declare @RowCount integer,@i integer;
    set @i=1
    set @RowCount=@@CURSOR_ROWS
    while 1=1
    begin
    fetch MyCursor1 into
             @Vend_num
     ,@Po_num
     ,@Chg_num
     ,@Po_line
     ,@Po_release
     ,@Seq  
     ,@Newitem    
     ,@Newstat     
     ,@Newduedate
            ,@Newvend_item
     ,@Newqty_ordered_conv
            ,@Newu_m
     ,@RecordDate
     ,@UpdatedBy
     ,@action_code
    if @@fetch_status<>0
       break
    if @action_code<>'D'--考虑更新状况
     begin 
      if @i=1
       begin
        set @Olditem=@Newitem
        set @Oldstat=@Newstat
        set @Oldduedate=@Newduedate
        set @Oldvend_item=@Newvend_item
        set @Oldqty_ordered_conv=@Newqty_ordered_conv
        set @Oldu_m=@Newu_m
       set @i=@i+1
       end
      else
       begin
        set @i=1
        insert into @ReportSet(Vend_num,Po_num,Chg_num,Po_line,Po_release,Seq,Olditem,Newitem,Oldstat,Newstat,Oldduedate,Newduedate,Oldvend_item,Newvend_item,Oldqty_ordered_conv,Newqty_ordered_conv,Oldu_m,Newu_m,RecordDate,UpdatedBy,action_code)
                                       values(@Vend_num,@Po_num,@Chg_num,@Po_line,@Po_release,@Seq,@Olditem,@Newitem,@Oldstat,@Newstat,@Oldduedate,@Newduedate,@Oldvend_item,@Newvend_item,@Oldqty_ordered_conv,@Newqty_ordered_conv,@Oldu_m,@Newu_m,@RecordDate,@UpdatedBy,@action_code)
       end
      
     end
    else --考虑删除的情况
     begin
        set @i=1
        set @Olditem=@Newitem
        set @Oldstat=@Newstat
        set @Oldduedate=@Newduedate
        set @Oldvend_item=@Newvend_item
        set @Oldqty_ordered_conv=@Newqty_ordered_conv
        set @Oldu_m=@Newu_m
        set
        insert into @ReportSet(Vend_num,Po_num,Chg_num,Po_line,Po_release,Seq,Olditem,Newitem,Oldstat,Newstat,Oldduedate,Newduedate,Oldvend_item,Newvend_item,Oldqty_ordered_conv,Newqty_ordered_conv,Oldu_m,Newu_m,RecordDate,UpdatedBy,action_code)
                                      values(@Vend_num,@Po_num,@Chg_num,@Po_line,@Po_release,@Seq,@Olditem,@Newitem,@Oldstat,@Newstat,@Oldduedate,@Newduedate,@Oldvend_item,@Newvend_item,@Oldqty_ordered_conv,@Newqty_ordered_conv,@Oldu_m,@Newu_m,@RecordDate,@UpdatedBy,@action_code)
     end
    end
    close MyCursor1
    deallocate MyCursor1

    select *
    from @ReportSet
    where Olditem<>Newitem OR Oldduedate<>Newduedate OR Oldqty_ordered_conv<>Newqty_ordered_conv OR action_code='D'

    GO

    展开全文
  • *方法:采用标志,首先保存第一行(旧资料),然后设置插入的变量的条件值*遇到删除标志,只有一行,设置插入标志,插入*/ CREATE procedure UF_Rpt_PoitemchgSp(@Startingpo_num PoNumType=NULL, --nvarchar(10)@Endingpo_...

    /*
    *通常遇到新旧行的比较.比如做采购变更单
    *但是如果是删除呢?如何处理?
    *方法:采用标志,首先保存第一行(旧资料),然后设置插入的变量的条件值
    *遇到删除标志,只有一行,设置插入标志,插入
    */

    CREATE procedure UF_Rpt_PoitemchgSp(
    @Startingpo_num PoNumType=NULL, --nvarchar(10)
    @Endingpo_num PoNumType=NULL, --nvarchar(10)
    @Startingpo_line PoLineType=NULL,--smallint(2)
    @Endingpo_line PoLineType=NULL, --smallint(2)
    @Startingchg_num ChgNumType=NULL,--int(4)
    @Endingchg_num ChgNumType=NULL,--int(4)
    @StartingRecordDate datetime =NULL,
    @EndingRecordDate datetime=NULL,
    @StartingVend_num nvarchar(10)=NULL, --nvarchar(10)
    @EndingVend_num nvarchar(10)=NULL --nvarchar(10)
    )
    AS

    declare @ReportSet table(
    Vend_num nvarchar(7)
    ,Po_num nvarchar(10)
    ,Chg_num int
    ,Po_line smallint
    ,Po_release smallint
    ,Seq smallint
    ,Olditem nvarchar(30)
    ,Newitem nvarchar(30)
    ,Oldstat nchar(1)
    ,Newstat nchar(1)
    ,Oldduedate datetime
    ,Newduedate datetime
    ,Oldvend_item nvarchar(30)
    ,Newvend_item nvarchar(30)
    ,Oldqty_ordered_conv decimal
    ,Newqty_ordered_conv decimal
    ,Oldu_m nvarchar(3)
    ,Newu_m nvarchar(3)
    ,RecordDate datetime
    ,UpdatedBy nvarchar(30)
    ,action_code nvarchar(1)
    )
    declare
    @Vend_num nvarchar(7)
    ,@Po_num nvarchar(10)
    ,@Chg_num int
    ,@Po_line smallint
    ,@Po_release smallint
    ,@Seq smallint
    ,@Olditem nvarchar(30)
    ,@Newitem nvarchar(30)
    ,@Oldstat nchar(1)
    ,@Newstat nchar(1)
    ,@Oldduedate datetime
    ,@Newduedate datetime
    ,@Oldvend_item nvarchar(30)
    ,@Newvend_item nvarchar(30)
    ,@Oldqty_ordered_conv decimal
    ,@Newqty_ordered_conv decimal
    ,@Oldu_m nvarchar(3)
    ,@Newu_m nvarchar(3)
    ,@RecordDate datetime
    ,@UpdatedBy nvarchar(30)
    ,@action_code nvarchar(1)
    Declare MyCursor1 CURSOR
    local static FOR SELECT p.vend_num,pc.po_num,pc.chg_num,pc.po_line,pc.po_release,pc.sequence,pc.item,pc.stat,pc.due_date,pc.vend_item,pc.qty_ordered_conv,pc.u_m,pc.RecordDate,pc.UpdatedBy,pc.action_code
    from
    poitmchg pc left outer join po p on pc.po_num=p.po_num

    where pc.action_code <>'A'
    and ltrim(pc.po_num)>=ltrim(ISNULL(@Startingpo_num,pc.po_num)) AND ltrim(pc.po_num)<=ltrim(ISNULL(@Endingpo_num,pc.po_num))--去掉空格
    AND rtrim(pc.chg_num)>=rtrim(ISNULL(@Startingchg_num ,pc.chg_num)) AND rtrim(pc.chg_num)<=rtrim(ISNULL(@Endingchg_num ,pc.chg_num))--增加变更单号删选条件
    AND pc.po_num<=ISNULL(@Endingpo_num,pc.po_num)
    AND pc.RecordDate>=ISNULL(convert(datetime,@StartingRecordDate),pc.RecordDate)
    AND pc.RecordDate<=ISNULL(convert(datetime,@EndingRecordDate),pc.RecordDate)
    AND pc.po_line>=ISNULL(@Startingpo_line,pc.po_line)
    AND pc.po_line<=ISNULL(@Endingpo_line,pc.po_line)
    AND p.vend_num>=ISNULL(@StartingVend_num,p.vend_num) AND p.vend_num<=ISNULL(@EndingVend_num,p.vend_num);
    Open MyCursor1
    declare @RowCount integer,@i integer;
    set @i=1
    set @RowCount=@@CURSOR_ROWS
    while 1=1
    begin
    fetch MyCursor1 into
    @Vend_num
    ,@Po_num
    ,@Chg_num
    ,@Po_line
    ,@Po_release
    ,@Seq
    ,@Newitem
    ,@Newstat
    ,@Newduedate
    ,@Newvend_item
    ,@Newqty_ordered_conv
    ,@Newu_m
    ,@RecordDate
    ,@UpdatedBy
    ,@action_code
    if @@fetch_status<>0
    break
    if @action_code<>'D'--考虑更新状况
    begin
    if @i=1
    begin
    set @Olditem=@Newitem
    set @Oldstat=@Newstat
    set @Oldduedate=@Newduedate
    set @Oldvend_item=@Newvend_item
    set @Oldqty_ordered_conv=@Newqty_ordered_conv
    set @Oldu_m=@Newu_m
    set @i=@i+1
    end
    else
    begin
    set @i=1
    insert into @ReportSet(Vend_num,Po_num,Chg_num,Po_line,Po_release,Seq,Olditem,Newitem,Oldstat,Newstat,Oldduedate,Newduedate,Oldvend_item,Newvend_item,Oldqty_ordered_conv,Newqty_ordered_conv,Oldu_m,Newu_m,RecordDate,UpdatedBy,action_code)
    values(@Vend_num,@Po_num,@Chg_num,@Po_line,@Po_release,@Seq,@Olditem,@Newitem,@Oldstat,@Newstat,@Oldduedate,@Newduedate,@Oldvend_item,@Newvend_item,@Oldqty_ordered_conv,@Newqty_ordered_conv,@Oldu_m,@Newu_m,@RecordDate,@UpdatedBy,@action_code)
    end

    end
    else --考虑删除的情况
    begin
    set @i=1
    set @Olditem=@Newitem
    set @Oldstat=@Newstat
    set @Oldduedate=@Newduedate
    set @Oldvend_item=@Newvend_item
    set @Oldqty_ordered_conv=@Newqty_ordered_conv
    set @Oldu_m=@Newu_m
    set
    insert into @ReportSet(Vend_num,Po_num,Chg_num,Po_line,Po_release,Seq,Olditem,Newitem,Oldstat,Newstat,Oldduedate,Newduedate,Oldvend_item,Newvend_item,Oldqty_ordered_conv,Newqty_ordered_conv,Oldu_m,Newu_m,RecordDate,UpdatedBy,action_code)
    values(@Vend_num,@Po_num,@Chg_num,@Po_line,@Po_release,@Seq,@Olditem,@Newitem,@Oldstat,@Newstat,@Oldduedate,@Newduedate,@Oldvend_item,@Newvend_item,@Oldqty_ordered_conv,@Newqty_ordered_conv,@Oldu_m,@Newu_m,@RecordDate,@UpdatedBy,@action_code)
    end
    end
    close MyCursor1
    deallocate MyCursor1

    select *
    from @ReportSet
    where Olditem<>Newitem OR Oldduedate<>Newduedate OR Oldqty_ordered_conv<>Newqty_ordered_conv OR action_code='D'

    GO

    展开全文
  • 在USART的发送端有2个寄存器,一个是程序可以看到的USART_DR寄存器,另一个是程序看不到的移位寄存器,对应USART数据发送有两个标志,一个是TXE=发送数据寄存器空,另一个是TC=发送结束。 当USART_DR中的数据传送到...

    在USART的发送端有2个寄存器,一个是程序可以看到的USART_DR寄存器,另一个是程序看不到的移位寄存器,对应USART数据发送有两个标志,一个是TXE=发送数据寄存器空,另一个是TC=发送结束。

    当USART_DR中的数据传送到移位寄存器后,TXE被设置,此时移位寄存器开始向TX信号线按位传输数据,但因为TDR已经变空,程序可以把下一个要发送的字节(操作USART_DR)写入TDR中,而不必等到移位寄存器中所有位发送结束,所有位发送结束时(送出停止位后)硬件会设置TC标志。

      另一方面,在刚刚初始化好USART还没有发送任何数据时,也会有TXE标志,因为这时发送数据寄存器是空的。TXEIE和TCIE的意义很简单,TXEIE允许在TXE标志为'1'时产生中断,而TCIE允许在TC标志为'1'时产生中断。

      至于什么时候使用哪个标志,需要根据你的需要自己决定。但我认为TXE允许程序有更充裕的时间填写TDR寄存器,保证发送的数据流不间断。TC可以让程序知道发送结束的确切时间,有利于程序控制外部数据流的时序。

     

    TXE--写寄存器DR清零

    RXNE--读寄存器DR清零,也可软件手动清零

    TC--  读/写寄存器DR清零,也可软件手动清零

     

    先说TC。即Transmission Complete。发送一个字节后才进入中断,这里称为“发送后中断”。和原来8051的TI方式一样,都是发送后才进中断,需要在发送函数中先发送一个字节触发中断。发送函数如下

    /*******
    功能:中断方式发送字符串.采用判断TC的方式.即 判断 发送后中断 位.
    输入:字符串的首地址
    输出:无
    *******/
    void USART_SendDataString( u8 *pData )
    {
        pDataByte = pData;
     
        USART_ClearFlag(USART1, USART_FLAG_TC);//清除传输完成标志位,否则可能会丢失第1个字节的数据.网友提供.
        
        USART_SendData(USART1, *(pDataByte++) ); //必须要++,不然会把第一个字符t发送两次
    }


    中断处理函数如下
    /********
    * Function Name  : USART1_IRQHandler
    * Description    : This function handles USART1 global interrupt request.
    * Input          : None
    * Output         : None
    * Return         : None
    *********/
    void USART1_IRQHandler(void)
    {
        if( USART_GetITStatus(USART1, USART_IT_TC) == SET  )
        {
            if( *pDataByte == '\0' )//TC需要 读SR+写DR 方可清0,当发送到最后,到'\0'的时候用个if判断关掉
                USART_ClearFlag(USART1, USART_FLAG_TC);//不然TC一直是set, TCIE也是打开的,导致会不停进入中断. clear掉即可,不用关掉TCIE
            else
                USART_SendData(USART1, *pDataByte++ );
        }

    }

    其中u8 *pDataByte;是一个外部指针变量

    在中断处理程序中,发送完该字符串后,不用关闭TC的中断使能TCIE,只需要清掉标志位TC;这样就能避免TC == SET 导致反复进入中断了。

    void USART_Config()
    {
     ........................................

     USART_ITConfig(USART1, USART_IT_TC, ENABLE);//Tramsimssion Complete后,才产生中断. 开TC中断必须放在这里,否则还是会丢失第一字节

     USART_Cmd(USART1, ENABLE); //使能USART1
    }

    .....................................................................

    再说判断TXE。即Tx DR Empty,发送寄存器空。当使能TXEIE后,只要Tx DR空了,就会产生中断。所以,发送完字符串后必须关掉,否则会导致重复进入中断。这也是和TC不同之处。

    发送函数如下:
    /*******
    功能:中断方式发送字符串.采用判断TC的方式.即 判断 发送后中断 位.
    输入:字符串的首地址
    输出:无
    *******/
    void USART_SendDataString( u8 *pData )
    {
        pDataByte = pData;
        USART_ITConfig(USART1, USART_IT_TXE, ENABLE);//只要发送寄存器为空,就会一直有中断,因此,要是不发送数据时,把发送中断关闭,只在开始发送时,才打开。
        
    }

    中断处理函数如下:

    /********
    * Function Name  : USART1_IRQHandler
    * Description    : This function handles USART1 global interrupt request.
    * Input          : None
    * Output         : None
    * Return         : None
    ********/
    void USART1_IRQHandler(void)
    {
        if( USART_GetITStatus(USART1, USART_IT_TXE) == SET  )
        {
            if( *pDataByte == '\0' )//待发送的字节发到末尾NULL了
                USART_ITConfig(USART1, USART_IT_TXE, DISABLE);//因为是 发送寄存器空 的中断,所以发完字符串后必须关掉,否则只要空了,就会进中断
            else
                USART_SendData(USART1, *pDataByte++ );
        }

    }

    在串口初始化函数中就不用打开TXE的中断了(是在发送函数中打开的)

    转载于:https://www.cnblogs.com/wt88/p/9767512.html

    展开全文
  • STM32的USART发送数据如何使用TXE和TC标志 在USART的发送端有2个寄存器,一个是程序可以看到的USART_DR寄存器,另一个是程序看不到的移位寄存器,对应USART数据发送有两个标志,一个是TXE=发送数据寄存器...
     

    STM32的USART发送数据时如何使用TXE和TC标志


    在USART的发送端有2个寄存器,一个是程序可以看到的USART_DR寄存器,另一个是程序看不到的移位寄存器,对应USART数据发送有两个标志,一个是TXE=发送数据寄存器空,另一个是TC=发送结束

    当USART_DR中的数据传送到移位寄存器后,TXE被设置,此时移位寄存器开始向TX信号线按位传输数据,但因为TDR已经变空,程序可以把下一个要发送的字节(操作USART_DR)写入TDR中,而不必等到移位寄存器中所有位发送结束,所有位发送结束时(送出停止位后)硬件会设置TC标志

      另一方面,在刚刚初始化好USART还没有发送任何数据时,也会有TXE标志,因为这时发送数据寄存器是空的。TXEIE和TCIE的意义很简单,TXEIE允许在TXE标志为'1'时产生中断,而TCIE允许在TC标志为'1'时产生中断。

      至于什么时候使用哪个标志,需要根据你的需要自己决定。但我认为TXE允许程序有更充裕的时间填写TDR寄存器,保证发送的数据流不间断。TC可以让程序知道发送结束的确切时间,有利于程序控制外部数据流的时序。

     

    TXE--写寄存器DR清零

    RXNE--读寄存器DR清零,也可软件手动清零

     TC--  读/写寄存器DR清零,也可软件手动清零

     

    先说TC。即Transmission Complete。发送一个字节后才进入中断,这里称为“发送后中断”。和原来8051的TI方式一样,都是发送后才进中断,需要在发送函数中先发送一个字节触发中断。发送函数如下

    /*******
    功能:中断方式发送字符串.采用判断TC的方式.即 判断 发送后中断 位.
    输入:字符串的首地址
    输出:无
    *******/
    void USART_SendDataString( u8 *pData )
    {
        pDataByte = pData;
      
        USART_ClearFlag(USART1, USART_FLAG_TC);//清除传输完成标志位,否则可能会丢失第1个字节的数据.网友提供.
        
        USART_SendData(USART1, *(pDataByte++) ); //必须要++,不然会把第一个字符t发送两次
    }


    中断处理函数如下
    /********
    * Function Name  : USART1_IRQHandler
    * Description    : This function handles USART1 global interrupt request.
    * Input          : None
    * Output         : None
    * Return         : None
    *********/
    void USART1_IRQHandler(void)
    {
        if( USART_GetITStatus(USART1, USART_IT_TC) == SET  )
        {
            if( *pDataByte == '\0' )//TC需要 读SR+写DR 方可清0,当发送到最后,到'\0'的时候用个if判断关掉
                USART_ClearFlag(USART1, USART_FLAG_TC);//不然TC一直是set, TCIE也是打开的,导致会不停进入中断. clear掉即可,不用关掉TCIE
            else
                USART_SendData(USART1, *pDataByte++ );
        }

    }

    其中u8 *pDataByte;是一个外部指针变量

    在中断处理程序中,发送完该字符串后,不用关闭TC的中断使能TCIE,只需要清掉标志位TC;这样就能避免TC == SET 导致反复进入中断了。

    void USART_Config()
    {
      ........................................

      USART_ITConfig(USART1, USART_IT_TC, ENABLE);//Tramsimssion Complete后,才产生中断. 开TC中断必须放在这里,否则还是会丢失第一字节

      USART_Cmd(USART1, ENABLE); //使能USART1
    }

    .....................................................................

    再说判断TXE。即Tx DR Empty,发送寄存器空。当使能TXEIE后,只要Tx DR空了,就会产生中断。所以,发送完字符串后必须关掉,否则会导致重复进入中断。这也是和TC不同之处。

    发送函数如下:
    /*******
    功能:中断方式发送字符串.采用判断TC的方式.即 判断 发送后中断 位.
    输入:字符串的首地址
    输出:无
    *******/
    void USART_SendDataString( u8 *pData )
    {
        pDataByte = pData;
        USART_ITConfig(USART1, USART_IT_TXE, ENABLE);//只要发送寄存器为空,就会一直有中断,因此,要是不发送数据时,把发送中断关闭,只在开始发送时,才打开。
        
    }

    中断处理函数如下:

    /********
    * Function Name  : USART1_IRQHandler
    * Description    : This function handles USART1 global interrupt request.
    * Input          : None
    * Output         : None
    * Return         : None
    ********/
    void USART1_IRQHandler(void)
    {
        if( USART_GetITStatus(USART1, USART_IT_TXE) == SET  )
        {
            if( *pDataByte == '\0' )//待发送的字节发到末尾NULL了
                USART_ITConfig(USART1, USART_IT_TXE, DISABLE);//因为是 发送寄存器空 的中断,所以发完字符串后必须关掉,否则只要空了,就会进中断
            else
                USART_SendData(USART1, *pDataByte++ );
        }

    }

    在串口初始化函数中就不用打开TXE的中断了(是在发送函数中打开的)

    展开全文
  • 在USART的发送端有2个寄存器,一个是程序可以看到的USART_DR寄存器,另一个是程序看不到的移位寄存器,对应USART数据发送有两个标志,一个是TXE=发送数据寄存器空,另一个是TC=发送结束。 当USART_DR中的数据传送到...
  • 1.加一计算列,设置edit为checkbox ,将列的EditStyle改为CheckBox(字段属性Edit页Style项),这一列没有任何含义,只是作为一个选中行的标志!2.增加计算列,在选择数据源画板中的Compute页中增加 as CheckMark就...
  • 在USART的发送端有2个寄存器,一个是程序可以看到的USART_DR寄存器,另一个是程序看不到的移位寄存器,对应USART数据发送有两个标志,一个是TXE=发送数据寄存器空,另一个是TC=发送结束。 当USART_DR中的数据传送到...
  • 1、使用session验证身份(查看id与session中的id是否一致)2、对id进行加密处理(如果id被恶意修改,篡改者不知道加密方法则服务端可查证)3、设置提交的间隔时间限制来防止重复提交4、在session中设置提交标志(每...
  • 那么该如何为MacBook或Mac电脑恢复出厂设置呢?下面跟随小编来一起学习一下吧! 恢复出厂设置之前最好做好数据备份,避免因数据丢失而造成各种损失!具体数据备份方法可以参考以下文章: macOS怎样备份?备份Mac文件...
  • 在keil5在编程环境下,想要实现的功能是:利用中断,让串口四接收数据,串口一发送数据 部分代码如下: int main(void) { //初始化USART1和UART4 配置模式为 115200 8-N-1,通过USART1发送数据,通过UART4接收...
  • //ifCreatePhoto 图像生成标志 int GetIdCardInfo(int port,int baud,byte[] extendCmd,byte[] idCardInfo,int timeout,long ifCreatePhoto); } GHC_IDREADER_API IDREADER_dll = GHC_IDREADER_API.INSTANCE; ...
  • 进程的引入单进程的操作系统,程序 的位置只需要简单设置内存上方放程序内容,内存下方放数据内容多进程的操作系统,多个程序在内存分配的位置和大小需要管理。那就引入了进程的概念。进程进程由程序段,数据段,PCB...
  • 本文主要介绍以下内容:1、XY图的外观2、数据组的前后顺序3、使用行标题对数据点标记4、微移XY数据组1、XY图的外观使用Format Graph 对话框可以改发一个数据组的所有外观。如果你想对单个数据点修改,就用右击菜单。...
  • 刚开始没有创建数据文件时运行正常,但往文件中添加数据之后再运行程序就报错,求大神帮忙分析一下原因,本人将感激不尽! ![图片说明](https://img-ask.csdn.net/upload/201904/24/1556120533_390262.jpg) ...
  • tcp PUSH 标志的理解

    千次阅读 2014-10-11 08:29:37
    PUSH标志 发送端 TCP将发送带有PUSH标志的数据包时,表示这个数据应该被立即发送,而...当前没有API通知TCP哪些数据需要被设置PUSH标示,完全由TCP自行判断决定。   TCP是如何决策哪些数据需要被标示PUSH呢?  
  • 多机通讯设置TB8

    2020-11-26 19:49:15
    串口多机通讯,上位机如何设置串口9位数据位/TB8 **常用的串口数据位设置只有5~8位,但对于多机通讯要求9位数据位,即要求通过设置TB8区分地址与数据的发送。** 先贴一下多机通讯的过程: 主机要发送一数据块给某一...
  • 首选需要删除影响显示效果的刻度线标签 设置数据标志数据标签为显示状态 然后针对在坐标轴以下的数据标签单独依次激活选中移动到坐标轴上方 最后在调整其间距工具/原料电脑excel方法/步骤1首先需要选中需要制作柱状...
  • 数据结构3 选择排序

    2019-11-19 09:52:38
    选择排序与冒泡算法本质上不同是: 选择排序设置一个标志量,根据这个标志量,只在每次扫描最后交换一次数据,而不像冒泡排序不停交换数据。相比于冒泡排序,选择排序是一种不稳定的排序算法。 如何理解选择算法的....
  • 1数据透视表刷新后如何保持调整好的列宽.xls4.1.2-2在应用了自动套用格式的数据透视表里保持列宽.xls4.1.3控制数据透视表的行列总计与分类汇总.xls4.1.3-3使用VBA代码控制数据透视表保持固定格式.xls4.1.4控制...

空空如也

空空如也

1 2 3 4 5 ... 13
收藏数 241
精华内容 96
关键字:

如何设置数据标志