Հնարավոր կրկնօրինակ՝
UART ISR Tx Rx Architecture
Ես հենց հիմա աշխատում եմ TI micro-ի հետ, որը ներառում է DMA UART Driver և օպերացիոն համակարգ, որն աջակցում է զուգահեռ առաջադրանքներին: UART վարորդի գործառույթները ներառում են.
- ստատիկ դատարկություն HalUARTInitDMA(void);
- static void HalUARTOpenDMA(halUARTCfg_t *config);
- ստատիկ uint16 HalUARTReadDMA(uint8 *buf, uint16 len);
- ստատիկ uint16 HalUARTWriteDMA(uint8 *buf, uint16 len);
- ստատիկ դատարկություն HalUARTPollDMA(անվավեր);
- ստատիկ uint16 HalUARTRxAvailDMA(անվավեր);
- static void HalUARTSuspendDMA(void);
- static void HalUARTResumeDMA(void);
Ես փորձում եմ շփվել մեկ այլ ծայրամասային սարքի հետ, որն ընդունում է հաղորդագրությունները, որոնք ավարտվում են փոխադրման հետադարձով և այնուհետև պատասխանում է հաղորդագրություններով՝ փոխադրման վերադարձով:
Ինձ հետաքրքրում էր, թե որն է այս տեսակի կապի պետական մեքենայի ճարտարապետության լավագույն միջոցը: Իմ խնդիրը UART նավահանգստի համար հետադարձ զանգի ֆունկցիան նախագծելն է այնպես, որ այն...
- չի կախում համակարգը՝ սպասելով պատասխանի: (Ինչ-որ ժամանակամիջոց)
- Եթե պատասխանը շատ շուտ կարդացվի, այն կմիավորի պատասխանները
- Փոխադրման վերադարձը կնշանակի հաղորդագրության ավարտը
Հիմնական տեսությունը մոտավորապես այսպիսին է.
//send messsage to peripheral
HalUARTWriteDMA("tx\r",4);
//wait a little bit for the device to process the message
//start reading from the peripheral
do {
//how many bytes are at the RX port?
int len = HalUARTRxAvailDMA();
//Read those bytes
HalUARTReadDMA(msg, len);
//append the rx msg to the buffer
strcat(rxbuf, msg)
//does the response contain a CR?
} while(strchr(rxbuf, 0x0D));
Այս գաղափարի մեջ կան մի քանի ակնհայտ թերություններ. Ես հուսով էի, որ ինչ-որ մեկը կարող է կիսվել որոշ գաղափարներով, թե ինչպես է իրականացվում այս տեսակի հաղորդակցությունը:
Շնորհակալություն