⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 serial.c

📁 一个C style Assembler的source code
💻 C
字号:
#include <stdio.h>#include <math.h>#include <float.h>#include <ctype.h>#include "MicroNet.h"#include "Com.h"#include "Port.h"#include "Console.h"FILE *FP = 0;byte TestX = 2, AbortX = 2, StatusX = 0, DumpX = 0, DataX = 0, Cursor = 0;void ShowTest(void) {   char Ch;   switch (TestX) {      case 0: Ch = '1'; break;      case 1: Ch = '2'; break;      case 2: Ch = '*'; break;   }   PutString(2, 15, RedC, "%c", Ch);}void ShowAbort(void) {   char Ch;   switch (AbortX) {      case 0: Ch = '1'; break;      case 1: Ch = '2'; break;      case 2: Ch = '*'; break;   }   PutString(2, 26, RedC, "%c", Ch);}void ShowStatus(void) {   switch (StatusX) {      case 0: PutString(2, 37, RedC, "1"); break;      case 1: PutString(2, 37, RedC, "2"); break;   }}void ShowDump(void) { PutString(4, 4, RedC, "%2d", DumpX + 1); }void ShowData(void) { PutString(4, 15, RedC, "%2d", DataX + 1); }void Screen(void) {   ScrInit();   PutString(0, 23, WhiteC, "C O M M A N D    I N T E R F A C E");   PutString(2, 4, YellowC, "COM1");     PutString(2, 18, YellowC, "Test");   PutString(2, 28, YellowC, "Abort");   PutString(2, 39, YellowC, "Status");   PutString(4,  7, YellowC, "Dump");    PutString(4, 18, YellowC, "Data");   Border(ROW(2, -4), ROW(3, 3), COL(15, -4), COL(16, 3), GreenC);   Border(ROW(2, -4), ROW(3, 3), COL(26, -4), COL(27, 3), GreenC);   Border(ROW(2, -4), ROW(3, 3), COL(37, -4), COL(38, 3), GreenC);   Border(ROW(4, -4), ROW(5, 3), COL(4, -4), COL(6, 3), GreenC);   Border(ROW(4, -4), ROW(5, 3), COL(15, -4), COL(17, 3), GreenC);   ShowTest(), ShowAbort(), ShowStatus(), ShowDump(), ShowData(),   PutString(4, 59, CyanC, "Line Status");   PutString(5, 52, CyanC, "Overflow");   PutString(6, 52, CyanC, "Overrun");   PutString(7, 52, CyanC, "Parity");   PutString(8, 52, CyanC, "Framing");   PutString(5, 64, CyanC, "Timed Out");   PutString(6, 64, CyanC, "Bad Header");   PutString(7, 64, CyanC, "Bad Checksum");   PutString(8, 64, CyanC, "Packet Full");}void Prompt(int Cursor, int On) {   int Color = On? RedC: GreenC;   switch (Cursor) {      case 0:         Border(ROW(2, -4), ROW(3, 3), COL(15, -4), COL(16, 3), Color);      break;      case 1:         Border(ROW(2, -4), ROW(3, 3), COL(26, -4), COL(27, 3), Color);      break;      case 2:         Border(ROW(2, -4), ROW(3, 3), COL(37, -4), COL(38, 3), Color);      break;      case 3:         Border(ROW(4, -4), ROW(5, 3), COL(4, -4), COL(6, 3), Color);      break;      case 4:         Border(ROW(4, -4), ROW(5, 3), COL(15, -4), COL(17, 3), Color);      break;   }}void ShowLine(void) {   static int LastState = 0; int Color;   if (LastState == Status) return;   LastState = Status;   if (FP) fprintf(FP, "Status %2x\n", Status);   Color = (Status&BUFFER_FULL)? RedC: BlackC;   Box(ROW(5, 0), ROW(6, -1), COL(50, 0), COL(51, -1), Color);   Color = (Status&OVERRUN_ERR)? RedC: BlackC;   Box(ROW(6, 0), ROW(7, -1), COL(50, 0), COL(51, -1), Color);   Color = (Status&PARITY_ERR)? RedC: BlackC;   Box(ROW(7, 0), ROW(8, -1), COL(50, 0), COL(51, -1), Color);   Color = (Status&FRAMING_ERR)? RedC: BlackC;   Box(ROW(8, 0), ROW(9, -1), COL(50, 0), COL(51, -1), Color);   Color = (Status&TIMED_OUT)? RedC: BlackC;   Box(ROW(5, 0), ROW(6, -1), COL(62, 0), COL(63, -1), Color);   Color = (Status&BAD_HEADER)? RedC: BlackC;   Box(ROW(6, 0), ROW(7, -1), COL(62, 0), COL(63, -1), Color);   Color = (Status&BAD_SUM)? RedC: BlackC;   Box(ROW(7, 0), ROW(8, -1), COL(62, 0), COL(63, -1), Color);   Color = (Status&PACKET_OVER)? RedC: BlackC;   Box(ROW(8, 0), ROW(9, -1), COL(62, 0), COL(63, -1), Color);   FlushPort();}unsigned long GetInt(byte *B, int Size) {   unsigned long Val;   for (Val = 0, B = B + Size - 1; Size > 0; Size--, B--)      Val = (Val << 8) | *B;   return Val;}double GetD(byte *B, int Size) {   double Val;   for (Val = 0.0, B = B + Size - 1; Size > 0; Size--, B--)      Val = 256.0*Val + (double)*B;   return Val;}#define OSC 921600.0#define STAT_SIZE 0x17#define X_SIZE 0x1540static byte StatBuf[STAT_SIZE], XBuf[X_SIZE];main() {   int Ch, Rx, Bytes, I; char Buf[80];   Screen(); OpenPort(COM1, 9600, DATA8 | PAR_LOW | STOP1, 0x4000);   Cursor = 0; Prompt(Cursor, 1);   while (1) switch (Keyboard()) {      case 3:         if (FP != 0) fclose(FP);         ClosePort(); ScrReset();      exit(0);      case 6: FlushPort(), ShowLine(); break;      case 4:         Box(ROW(10, 0), ROW(30, -1), COL(0, 0), COL(80, -1), BlackC);      break;      case Esc:         if (FP != 0) {            fclose(FP);            Box(ROW(2, 0), ROW(3, -1), COL(46, 0), COL(80, -1), BlackC);         }      break;      case 12:         PutString(2, 46, RedC, "Logging.  Filename: ");         for (I = 0; ; ) switch (Ch = Keyboard()) {            case '\b':               if (I > 0) PutString(2, 66 + --I, BlackC, " ");            break;            case Esc:               Box(ROW(2, 0), ROW(3, -1), COL(46, 0), COL(80, -1), BlackC);            goto BreakEnter;            case '\r':               Buf[I] = '\0';               FP = fopen(Buf, "w");               if (FP == 0)                  Box(ROW(2, 0), ROW(3, -1), COL(46, 0), COL(80, -1), BlackC);            goto BreakEnter;            case '\0': break;            default:               if (I < 14)                  PutString(2, 66 + I, RedC, "%c", Buf[I] = Ch), I++;            break;         }      BreakEnter:      break;      case Right:         Prompt(Cursor, 0); Cursor = (Cursor + 1)%5; Prompt(Cursor, 1);      break;      case Left:         Prompt(Cursor, 0); Cursor = (Cursor + 4)%5; Prompt(Cursor, 1);      break;      case Up: switch (Cursor) {         case 0: TestX = (TestX + 1)%3; ShowTest(); break;         case 1: AbortX = (AbortX + 1)%3; ShowAbort(); break;         case 2: StatusX = (StatusX + 1)%2; ShowStatus(); break;         case 3: DumpX = (DumpX + 1)%12; ShowDump(); break;         case 4: DataX = (DataX + 1)%12; ShowData(); break;      }      break;      case Down: switch (Cursor) {         case 0: TestX = (TestX + 2)%3; ShowTest(); break;         case 1: AbortX = (AbortX + 2)%3; ShowAbort(); break;         case 2: StatusX = (StatusX + 1)%2; ShowStatus(); break;         case 3: DumpX = (DumpX + 11)%12; ShowDump(); break;         case 4: DataX = (DataX + 11)%12; ShowData(); break;      }      break;      case '\r': switch (Cursor) {         case 0:            SendTest(TestX); if (FP) fprintf(FP, "TEST %c\n", Ch);            ShowLine();         break;         case 1:            FlushPort();            SendAbort(AbortX); if (FP) fprintf(FP, "ABORT %c\n", Ch);            ShowLine();         break;         case 2:            Rx = SendStatus(StatusX);            switch (Rx) {               case '0': PutString(6, 35, WhiteC, " Active"); break;               case '1': PutString(6, 35, WhiteC, "Waiting"); break;               case '2': PutString(6, 35, WhiteC, "Testing"); break;               default:  PutString(6, 35, WhiteC, "(%2x)  ", Rx); break;            }            if (FP) fprintf(FP, "STATUS %d => %c\n", StatusX + 1, Rx);            ShowLine();         break;         case 3:            Box(ROW(10, 0), ROW(30, -1), COL(0, 0), COL(80, -1), BlackC);            if (FP) fprintf(FP, "DUMP %2d\n", DumpX + 1);            Bytes = GetDump(DumpX, XBuf, X_SIZE);            if (Status == 0) { /* DUMP */              int Row, Col, I;              for (Row = 10, Col = 0, I = 0; I < Bytes; I += 4) {                 PutString(Row, Col, WhiteC, "%9.6f",                    GetD(XBuf + I, 4)/OSC                 );                 if (FP) fprintf(FP, "%9.6f\n", GetD(XBuf + I, 4)/OSC);                 if (++Row == 30) {                    Row = 10, Col += 10;                    if (Col == 80) {                       Check:                       switch (Keyboard()) {                          case '\r':                             Col = 0;                             Box(ROW(10, 0), ROW(30, -1), COL(0, 0), COL(80, -1), BlackC);                          break;                          case Esc: goto QuitDump;                          default: goto Check;                       }                    }                 }              }            }         QuitDump:            ShowLine();         break;         case 4:            Box(ROW(10, 0), ROW(30, -1), COL(0, 0), COL(80, -1), BlackC);            if (FP) fprintf(FP, "DATA %2d\n", DataX + 1);            Bytes = GetStats(DataX, StatBuf, STAT_SIZE);            if (Status == 0 && Bytes != STAT_SIZE) {               PutString(10, 5, RedC, "Statistics ... packet error");               if (FP) fprintf(FP, "Packet error.\n");            } else if (Status == 0) { /* DATA */               byte StatusS; word CyclesS;               unsigned long TimeS, FirstS, LastS;               double SquareS;               StatusS = GetInt(StatBuf +  0, 1);               CyclesS = GetInt(StatBuf +  1, 2);               TimeS   = GetInt(StatBuf +  3, 4);               FirstS  = GetInt(StatBuf +  7, 4);               LastS   = GetInt(StatBuf + 11, 4);               SquareS = GetD(StatBuf + 15, 8);               PutString(10, 5, WhiteC, "Statistics");               PutString(12, 5, WhiteC, "Status %2x", StatusS);               PutString(14, 5, WhiteC, "Cycles %4d", CyclesS);               PutString(16, 5, WhiteC, "First  %11.6f", (double)FirstS/OSC);               PutString(18, 5, WhiteC, "Last   %11.6f", (double)LastS/OSC);               PutString(20, 5, WhiteC, "Time   %11.6f", (double)TimeS/OSC);               PutString(22, 5, WhiteC, "Square %11.6f", SquareS/OSC/OSC);               if (FP) {                  fprintf(FP, "Status %2x\n", StatusS);                  fprintf(FP, "Cycles %4d\n", CyclesS);                  fprintf(FP, "First  %11.6f\n", (double)FirstS/OSC);                  fprintf(FP, "Last   %11.6f\n", (double)LastS/OSC);                  fprintf(FP, "Time   %11.6f\n", (double)TimeS/OSC);                  fprintf(FP, "Square %11.6f\n", SquareS/OSC/OSC);               }               PutString(10, 49, WhiteC, "Results");               PutString(12, 49, WhiteC, "Test Time %11.6f", (double)TimeS/OSC);               if (StatusS&0x40) {                  PutString(14, 49, RedC, "Aborted.");                  if (FP) fprintf(FP, "Aborted.\n");               } else if (FirstS == LastS) {                  PutString(14, 49, RedC, "No pulses.");                  if (FP) fprintf(FP, "No pulses.\n");               } else {                  double                     Ave = (double)(LastS - FirstS)/(double)CyclesS,                     Ave2 = SquareS/(double)CyclesS;                  PutString(14, 49, WhiteC, "Nutations %11.6f",                     (double)TimeS/Ave                  );                  PutString(15, 52, WhiteC, "First Partial %11.6f",                     (double)FirstS/Ave                  );                  PutString(16, 52, WhiteC, "Whole Cycles  %11.6f",                     (double)CyclesS                  );                  PutString(17, 52, WhiteC, "Last Partial  %11.6f",                     (double)(TimeS - LastS)/Ave                  );                  if (FP)                     fprintf(FP, "Nutations: %11.6f (%11.6f + %11.6f + %11.6f)\n",                        (double)TimeS/Ave, (double)FirstS/Ave, (double)CyclesS,                        (double)(TimeS - LastS)/Ave                     );                  if (Ave2 < Ave*Ave) {                     PutString(19, 49, RedC, "Cannot calculate vatiation");                     if (FP) fprintf(FP, "Cannot calculate variation.\n");                  } else {                     PutString(19, 49, WhiteC, "Variation %3.4f%%",                        sqrt(Ave2/(Ave*Ave) - 1.0)*100.0                     );                     if (FP) fprintf(FP, "Variation %3.4f%%\n",                        sqrt(Ave2/(Ave*Ave) - 1.0)*100.0                     );                  }               }            }            ShowLine();         break;      }      break;   }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -