关于PIC18F25k50的中断

时间:2013-11-21 05:41:03

标签: c serial-port usb

我正在为串行端做一个循环缓冲区。以下是部分编码:

void YourHighPriorityISRCode()
{
    if(INTCON3bits.INT2IF == 1)
{
    INTCON3bits.INT2IF = 0; 
}   

if(PIR1bits.RCIF!=1) 
    return;

rxbuf = RCREG;

if (rxbuf==TOKEN)
{
    b485RxToken = 1;
    return;
}   

if (!b485SOH)
{
    if (rxbuf!=SOH)
    {
        return;
    }
    b485SOH=1;
    return;
}   
if (n485RxDataPos>=RS485RXSIZE)
    n485RxDataPos = 0;

RS485RXDATA[n485RxDataPos++] = rxbuf;
if (rxbuf == EOT) 
    b485SOH = 0;    
    }

void main(void)
{
nstate = STATE_RS485_RXDATA;
    while(1)
{
    USBDeviceTasks();
switch (nState)
{

    case STATE_RS485_RXDATA:
        p485 = 0;
        INTCONbits.GIE = 1;
        if (nUSBReady == 0)
        {
            if (n485RxDataPos != n485PrDataPos)
            {
                j = n485PrDataPos;
                for (i=0; i<RS485RXSIZE; i++)
                {
                    if (RS485RXDATA[n485PrDataPos] == EOT)
                    {
                        byTmp = i;
                        n485PrDataPos++;
                        memset (hid_report_in, 0, sizeof(hid_report_in));
                        hid_report_in[0] = SOH;
                        if (RS485RXSIZE - j >= byTmp + 1)
                            memcpy ((void*)&hid_report_in[1], (void*)&RS485RXDATA[j], byTmp);
                        else if (RS485RXSIZE - j < byTmp + 1)
                        {
                            memcpy ((void*)&hid_report_in[1], (void*)&RS485RXDATA[j], byTmp);
                            memcpy ((void*)&hid_report_in[RS485RXSIZE - j + 1], (void*)&RS485RXDATA[0], (byTmp+1)-(RS485RXSIZE - j));
                        }
                        hid_report_in[byTmp+1] = EOT;
                        hid_report_in[byTmp+2] = 0x00;
                        if (RS485RXSIZE - j >= byTmp + 1)
                            memset (&RS485RXDATA[j], 0, byTmp+1);
                        else if (RS485RXSIZE - j < byTmp + 1)
                        {
                            memset (&RS485RXDATA[j], 0, byTmp+1);
                            memset (&RS485RXDATA[0], 0, (byTmp+1)-(RS485RXSIZE - j));
                        }
                        nState = STATE_SERVER_TXDATA;
                        nRS485TX = 1;
                        nUSBReady = 1;
                        break;
                    }
                    n485PrDataPos++;
                    if (n485PrDataPos>=RS485RXSIZE)
                        n485PrDataPos = 0;
                }
            }
        }
                  break;

    case STATE_SERVER_TXDATA:
        if (nHoldTXServer>0)        
        {
            nHoldTXServer--;
            break;
        }
        if (HIDTxHandleBusy(USBInHandle) == 0)       
        {
            USBInHandle = HIDTxPacket(HID_EP, (BYTE*)&hid_report_in, HID_INPUT_REPORT_BYTES);
            nState = STATE_RS485_RXDATA;
            nWaitTXServer = 0;
            nHoldTXServer = nDefaultHoldTXServer;
            if (nRS485TX == 1) 
            {
                nRS485TX = 0;
                nUSBReady = 0;
            }
        }

        if (nWaitTXServer <= 0)
        {
            nWaitTXServer = 5000;
        }
        else
            nWaitTXServer--;

        break;
    }
}

此处的应用程序是通过USB端口传输串行端口上收到的任何内容。 我在这里遇到的问题是从我的USB通信接收数据的设备有时会遗漏一些数据。就像我有四个协议:协议A,协议B,协议C和协议D由串口接收,我的usb端口也假设发送所有四个协议。但是接收我的usb协议的设备有时会错过一个。我想在这里检查一下是什么问题。

我已经检查过我的串口收到了所有四种协议。现在是我的一面。如何检查我的USB端是否全部发送出去?

我正在使用Picket3,因此我无法使用调试窗口并将数据打印出来。我唯一的做法是在“USBInHandle = HIDTxPacket(HID_EP,(BYTE *)&amp; hid_report_in,HID_INPUT_REPORT_BYTES);”行上设置一个断点。每当我的例程运行到该断点时它就会停止。通过在该行放置一个断点表明我的数据是由usb传输出来的吗?

0 个答案:

没有答案