[51 SCM Experiment Notes] Zusammenfassung der im ersten Teil (1) aufgetretenen Probleme (kontinuierlich aktualisiert)

Probleme mit der Entwicklungsumgebung

Identifizierung des seriellen CH340-Ports fehlgeschlagen (22.12.17)

  1. Mit dem Datenkabel verbinden, Gerätemanager öffnen, Port (COM) prüfen , ob ein serieller Port mit dem Wort „CH340“ vorhanden ist. Wenn nicht, bedeutet dies, dass die serielle Schnittstelle nicht richtig erkannt wird.
  2. Überprüfen Sie, ob der CH340-Treiber installiert ist.
  3. Ersetzen Sie das Datenkabel und versuchen Sie es erneut . Einige Datenkabelschnittstellen scheinen 5 Pins zu haben (z. B. Micro-USB), aber tatsächlich gibt es nur zwei Ladekabel, keine Datenübertragungsfunktion, kein Differenzsignal, natürlich kann die serielle Schnittstelle nicht erkannt werden.
  4. Versuchen Sie es mit einer anderen USB-Schnittstelle des Computers . Möglicherweise liegt es an der Qualität der Schnittstelle.
  5. Überprüfen Sie , ob der USB-zu-TTL-Schaltkreis verlötet oder beschädigt ist. (im Allgemeinen nicht)

Wie Keil5 mit C51 und STM32 kompatibel ist (22.12.17)

  • Besuchen Sie die offizielle Website. Es gibt zwei Versionen für 51-Einzelchip-Mikrocomputer und STM32-Einzelchip-Mikrocomputer.
    • Keil uvision5 ( MDK-ARM ): Entwicklungsumgebung für Cortex- und ARM-Geräte. Entwickelt für Cortex-Kern und ARM-Kern .
    • Keil uvision5( C51 ): Entwicklungstools für alle 8051-Geräte. Ausgelegt für 51 Kerne .
  • Laden Sie beide Versionen in dasselbe Verzeichnis herunter , um sie gleichzeitig zu verwenden.

So erstellen Sie eine C51-Projektvorlage (22.12.17)

  • Keil4: Suchen Sie einfach nach dem AT89C52 -Chip der Atmel Company .
  • Keil5: Finden Sie den AT89C51/AT89C52 in Microchip .

So ändern Sie die Schriftgröße (22.12.17)

  • Öffnen Sie Keil , klicken Sie auf das Schraubenschlüsselsymbol ganz rechts , klicken Sie auf die Registerkarte Schriftart , wählen Sie C/C++ aus und ändern Sie die entsprechende Schriftgröße .
  • Wenn "Der Zugriff auf xxxx global.prop wurde verweigert", schließen Sie Keil , führen Sie Keil als Administrator aus und wiederholen Sie die oben genannten Vorgänge.

Keils „0xFD“-Bug (23.03.04)

Während eines versehentlichen seriellen Kommunikationsvorgangs konnte das chinesische Zeichen „Nummer“ nicht korrekt angezeigt werden, was sich als Fehler aus Keils Geschichte herausstellte .

Ein Teil der chinesischen Zeichen, deren interner Code mit 0xFD endet, wird abgeschnitten ( z. B. Zahl , positiv , über usw.) und beeinträchtigt sogar die normale Anzeige nachfolgender chinesischer Zeichen. Die oben genannten chinesischen Schriftzeichen sollten möglichst vermieden werden.


Keil-Chinesisch zeigt keine oder verstümmelte Zeichen oder Fragezeichen an (23.08.23)

Wählen Sie auf der Registerkarte Bearbeiten die Option Konfiguration aus und stellen Sie die Kodierungsmethode Kodierung auf UTF-8 oder GB2312 ein .

Es wurde festgestellt, dass der ANSI-Code in Keil nicht mit dem aktuellen Systemcode übereinstimmt . Die tatsächliche Messumgebung ist ein Windows-System . Der GBK- Code kann beim Öffnen im Keil- Editor normal angezeigt werden . Bei der Eingabe chinesischer Zeichen wird jedoch ein Fragezeichen angezeigt und es wird tatsächlich nur ein einzelnes Byte empfangen . Dies sollte ein Fehler von Keil sein .


Problem mit verstümmelter chinesischer Übertragung der seriellen Schnittstelle von Keil (23.09.02)

Das Phänomen besteht darin, dass die Übertragung von Einzelbyte-Datenübertragungen oder der Übertragung englischer Zeichen normal ist und das Problem mit dem Programm der seriellen Schnittstelle ausgeschlossen ist. Das Problem liegt in der Inkonsistenz der Textkodierungsmethode .

Senden Sie das chinesische Zeichen „open“ über die Abfrage, seine GBKCodierung ist 0xBF 0xAA, Unicodedie Codierung ist 0x5F 0x00, UTF-8die Codierung ist 0xE5 0xBC 0x80.

Der Assistent für die serielle Schnittstelle HEXdruckt die Methode und das Ergebnis ist 0xE5 0xBC 0x80, was darauf hinweist , dass die Keil- Codierungsmethode lautet UTF-8.

Häufig verwendete Assistenten für serielle Schnittstellen unterstützen im Allgemeinen keine Kodierung, unterstützenUTF-8 jedoch die Kodierung. Bisher ist das Problem klar : Die Codierungsmethode des Senders stimmt nicht mit der Decodierungsmethode des Empfängers überein , was zu verstümmelten chinesischen Zeichen führt .GBK

Lösung : Ändern Sie die Codierungsmethode von Keil in GB2312 und bestätigen Sie, dass die Codierungsmethode der Quelldatei ANSI (GBK) ist . Oder finden Sie einen Assistenten für die serielle Schnittstelle , der die UTF-8 -Kodierung unterstützt .


Verschönerung der chinesischen Schriftart Keil (23.09.02)

Im UTF-8Kodierungsformat können Sie die Standardschriftart Courier newund andere Schriftarten verwenden. Nachdem die Kodierungsmethode jedoch auf GB2312 geändert wurde , werden die meisten Schriftartänderungen ungültig .

Lösung:

  1. Laden Sie die neue Schriftartdatei YaHei -Consolas-Hybrid herunter . Geben Sie gitBefehle an.
    git clone https://gitee.com/a42/YaHei-Consolas-Hybrid-1.12.git && sh YaHei-Consolas-Hybrid-1.12/setup.sh && cd - && rm -rf YaHei-Consolas-Hybrid-1.12
    
  2. Doppelklicken Sie auf die Schriftartenbibliotheksdatei .ttfund klicken Sie auf „Herunterladen“ . Schriftarten werden in die Schriftartenbibliothek des Systems heruntergeladen .
  3. Keil erneut öffnen , einstellen Edit- Configuration- Color&Fonts- C/C++ Editor Files- Font-YaHei-Consolas-Hybrid

Beachten Sie, dass Schriftarten mit dem Präfix chinesische Zeichen um 90° drehen.@


Problem mit C51-Syntaxdetails

Gleitkomma oder Ganzzahl in String-Schema umwandeln (23.03.04)

Mit der Zeichenfolgenformatierungsfunktion sprintf lautet das Format

#include <stdio.h>  // 需包含头文件

char strA[10]; // 保证一定长度,用于保存字符串
char strB[10]; 
char strC[10]; 
sprintf(strA, "%d", 123);  // 整数转换字符串
sprintf(strA, "%u", 65530); // 整数转换字符串,指定按无符号解析
sprintf(strC, "%0.6f, 3.141593"); // 浮点数转换字符串

erfordert Aufmerksamkeit: Beim Konvertieren einer Ganzzahl bezieht sich „%d“ auf den Typ int, der zwei Bytes belegt (im Keil-Compiler) . Wenn also eine Ganzzahl übergeben wird , sollte auch eine Zwei- Byte- Ganzzahl übergeben werden . Wenn versehentlich der häufig verwendete vorzeichenlose Zeichentyp (der nur 1 Byte ausmacht) eingegeben wird , ist das Konvertierungsergebnis abnormal .


Problem mit der Vorrangigkeit bitweiser Operatoren (23.08.08)

return tempH<<8 + tempL;    // 先执行加法,而非左移
return (tempH<<8) + tempL;  // 先执行左移

Tatsächlich

  • Die Priorität der Linksverschiebungs- <<und Rechtsverschiebungsoperatoren >>ist niedriger als die der Addition +und Subtraktion -und höher als die von Größer >als und Kleiner als . Für Spaltenausdrücke< sind Klammern erforderlich .
  • Bitweises UND &, bitweises XOR ^und bitweises ODER haben nacheinander niedrigere| Prioritäten , die alle niedriger sind als relationale Operatoren.

Der ungewöhnliche Fehler, dass die digitale Röhre nicht „0“ anzeigt (23.08.09)

Das Phänomen besteht darin, dass andere Zeichen normal angezeigt werden , die Zeichen jedoch 0überhaupt nicht angezeigt werden.

Der Grund dafür ist, dass das ASCII -Zeichen des Endzeichens der Zeichenfolge genau ist . Wenn also in der Anzeigefunktion für digitale Röhren ein Fehler am Ende der Zeichenfolge auftritt , wird diese direkt beendet, was dazu führt, dass die Zeichen nicht normal angezeigt werden.'\0'000

Lösung : Geben Sie einfach die ASCII-0 Zeichen ein .


Problem mit der Byteanzahl des Datentyps im Keil-Compiler (23.09.03)

Im Keil, int 2 Bytes 65536
PC end int 4 Bytes

Ohne Vorzeichen char 1 char 1


Problem mit dem Bitdatentyp (23.09.03)


Häufige Warnmeldungen

Funktion wird nicht als Warnung bezeichnet (22.12.19)

*** WARNING Lxx(行号): UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESS     SEGMENT: ?PR?xxxx(函数名)?MAIN

Diese Warnung tritt auf, wenn Sie eine Funktion definieren, sie aber nicht aufrufen . Dies ist im Allgemeinen keine Warnung in der Standard-C- Programmierung . Ich vermute, dass die RAM-Ressourcen des Single-Chip-Mikrocomputers relativ knapp sind und diese Warnung den Programmierer dazu veranlassen kann , nutzlose Codes zu reduzieren .


Codewarnung kann nie ausgeführt werden (23.08.08)

warning C294: unreachable code

Bezieht sich auf Code, der logischerweise niemals ausgeführt werden kann .Theoretisch hat dies keinen Einfluss auf die Ausführung des Programms. Wenn Sie diese Warnung jedoch versehentlich entdecken, führt dies zu einer abnormalen seriellen Kommunikation. Nehmen Sie es hier auf.


Warnung vor doppelter Definition (23.09.01)

xxx.c(4): warning C231: 'xxxx': redefinition

Das heißt, der Compiler gibt diese Warnung aus, wenn er eine doppelte Definition einer Variablen mit demselben Namen findet. Im Allgemeinen durch die folgenden drei Gründe verursacht:

  • Eine Funktionsdeklaration gibt keinen Rückgabetyp an . Der Typstandard in C51 besteht darin , eine Warnung zu generieren , wenn der von der Funktion implementierte Typ nicht mit diesem übereinstimmt . Zum Beispielintfunc1(void);
  • Eine Variable mit demselben Namen wie in einer C-Datei oder in einer Header-Datei , aber mit einem anderen Datentyp, erzeugt eine Warnung . Suchen Sie nach Konflikten mit benutzerdefinierten Variablennamen .
  • Bei externer Deklaration wird der Datentyp standardmäßig verwendet und diese Warnung wird in C51 generiert . Zum Beispielextern para1;

Daher können solche Warnungen gelöst werden, indem zunächst bestätigt wird, ob ein Variablennamenkonflikt vorliegt , und zweitens überprüft wird , ob die Deklaration den Datentyp angibt .


Häufige Fehlermeldung

Variablendefinitionsfehler (22.12.19)

main.c(xx): error C141: syntax error near 'int', expected 'sizeof'
  • Überprüfen Sie zunächst, ob Sie geistig behinderte Fehler gemacht haben: ob Sie die Klammern und Semikolons übersehen haben.

  • Liegt kein Problem mit der Syntax vor, liegt es im Allgemeinen an Unterschieden im Compiler. Der Keil-Compiler folgt dem älteren C-Standard .Innerhalb der Funktionsdefinition müssen alle lokalen statischen Variablen und automatischen Variablen deklariert werden , bevor mit dem anschließenden Schreiben des Codes begonnen werden kann, andernfalls meldet der Compiler einen Fehler.

  • Beispielsweise können wir in Standard-C Variablendefinitionen in For - Schleifen schreiben .

    for(int i = 0; i < 10; i++){
          
          
    	// 正常运行
    }
    

    Wenn Sie jedoch in Keil auf diese Weise schreiben, wird der obige Fehler gemeldet, was dazu führt, dass die Variable nicht korrekt definiert wird. Solange die Variable in Zukunft verwendet wird, wird ein undefinierter Bezeichnerfehler gemeldet (viele davon können). generiert).

    Es sollte also korrigiert werden

    int i; //先定义变量
    for(i = 0; i < 10; i++){
          
          
    	//正常运行
    }
    

Dateityp-Importfehler (23.3.13)

FCARM - Output Name not specified, please check ‘Options for Target - Utilities

.cWenn die Summendatei des Benutzers in keil.h importiert wird , wird sie möglicherweise als Bilddateidatei erkannt (Symbole unterscheiden sich von normalen C-Dateien). Wählen Sie die entsprechende Datei aus, klicken Sie mit der rechten Maustaste, um sie auszuwählen Options for File, und File Typewählen Sie den richtigen Dateityp aus.


Adressüberlauffehler (23.09.03)

*** ERROR Lxxx: ADDRESS SPACE OVERFLOW

Beim Kompilieren des Mikrocontrollers gibt es drei Parameter
: Daten 128 Bytes,
xDaten 128 Bytes,
Code 8 KB


Mehrdeutiger Fehler bei der Variableninitialisierung (23.09.03)

error C247: non-address/-constant initializer

Die definierte Variable wird nicht mit einer expliziten Konstante initialisiert. Weisen Sie ausstehende „Konstanten“ wie Makrodefinitionen, die berechnet werden müssen, nicht neu definierten Variablen zu, da sonst ein Fehler gemeldet wird.

Je suppose que tu aimes

Origine blog.csdn.net/m0_46500149/article/details/128350545
conseillé
Classement