usart_sim.c 3.5 KB
Newer Older
1
#include  <rthw.h>
2 3 4 5
#include  <rtthread.h>
#include  <windows.h>
#include  <mmsystem.h>
#include  <stdio.h>
6

7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
#include "serial.h"

struct serial_int_rx serial_rx;
extern struct rt_device serial_device;

/*
 * Handler for OSKey Thread
 */
static HANDLE       OSKey_Thread;
static DWORD        OSKey_ThreadID;

static DWORD WINAPI ThreadforKeyGet(LPVOID lpParam);
void rt_hw_usart_init(void)
{

22
    /*
23
     * create serial thread that receive key input from keyboard
24
     */
25 26

    OSKey_Thread = CreateThread(NULL,
27 28 29 30 31 32
                                0,
                                (LPTHREAD_START_ROUTINE)ThreadforKeyGet,
                                0,
                                CREATE_SUSPENDED,
                                &OSKey_ThreadID);
    if (OSKey_Thread == NULL)
33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
    {
        //Display Error Message

        return;
    }
    SetThreadPriority(OSKey_Thread,
                      THREAD_PRIORITY_NORMAL);
    SetThreadPriorityBoost(OSKey_Thread,
                           TRUE);
    SetThreadAffinityMask(OSKey_Thread,
                          0x01);
    /*
     * Start OS get key Thread
     */
    ResumeThread(OSKey_Thread);

}

/*
52 53 54 55
 * 方向键(←): 0xe04b
 * 方向键(↑): 0xe048
 * 方向键(→): 0xe04d
 * 方向键(↓): 0xe050
56 57 58
 */
static int savekey(unsigned char key)
{
59 60 61
    /* save on rx buffer */
    {
        rt_base_t level;
62

63
        /* disable interrupt */
64
        //暂时关闭中断,因为要操作uart数据结构
65
        level = rt_hw_interrupt_disable();
66

67 68 69 70 71 72
        /* save character */
        serial_rx.rx_buffer[serial_rx.save_index] = key;
        serial_rx.save_index ++;
        //下面的代码检查save_index是否已经到到缓冲区尾部,如果是则回转到头部,称为一个环形缓冲区
        if (serial_rx.save_index >= SERIAL_RX_BUFFER_SIZE)
            serial_rx.save_index = 0;
73 74

        //这种情况表示反转后的save_index追上了read_index,则增大read_index,丢弃一个旧的数据
75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100
        /* if the next position is read index, discard this 'read char' */
        if (serial_rx.save_index == serial_rx.read_index)
        {
            serial_rx.read_index ++;
            if (serial_rx.read_index >= SERIAL_RX_BUFFER_SIZE)
                serial_rx.read_index = 0;
        }

        /* enable interrupt */
        //uart数据结构已经操作完成,重新使能中断
        rt_hw_interrupt_enable(level);
    }

    /* invoke callback */
    if (serial_device.rx_indicate != RT_NULL)
    {
        rt_size_t rx_length;

        /* get rx length */
        rx_length = serial_rx.read_index > serial_rx.save_index ?
                    SERIAL_RX_BUFFER_SIZE - serial_rx.read_index + serial_rx.save_index :
                    serial_rx.save_index - serial_rx.read_index;

        serial_device.rx_indicate(&serial_device, rx_length);
    }
    return 0;
101 102 103
}
static DWORD WINAPI ThreadforKeyGet(LPVOID lpParam)
{
104
    unsigned char key;
105 106 107

    (void)lpParam;              //prevent compiler warnings

108
    for (;;)
109
    {
110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131
        key = _getch();//getchar();
        if (key == 0xE0)
        {
            key = _getch();

            if (key == 0x48) //up key , 0x1b 0x5b 0x41
            {
                savekey(0x1b);
                savekey(0x5b);
                savekey(0x41);
            }
            else if (key == 0x50)//0x1b 0x5b 0x42
            {
                savekey(0x1b);
                savekey(0x5b);
                savekey(0x42);
            }

            continue;
        }

        savekey(key);
132 133
    }
} /*** ThreadforKeyGet ***/