Una base de conocimientos sobre puertos serie
- TTL nivel
TTL es Transistor-Transistor Logic, la abreviatura de Transistor-Transistor Logic, que es una tecnología estándar para la comunicación entre varias partes de equipos controlados por un procesador de computadora. La señal de nivel TTL se usa ampliamente porque su representación de datos adopta regulaciones binarias, + 5V es equivalente a un "1" lógico y 0V es equivalente a un "0" lógico.
En los circuitos digitales, el nivel del circuito compuesto por componentes electrónicos TTL es un rango de voltaje, que estipula:
nivel alto de salida> = 2.4V, nivel bajo de salida <= 0.4V;
nivel alto de entrada> = 2.0V, Ping de baja potencia de entrada <= 0,8V.
2. Nivel RS232 El nivel
RS232 es un estándar para los puertos serie.
En las líneas de datos TXD y RXD:
(1) La lógica 1 es un voltaje de -3 ~ -15V
(2) La lógica 0 es un voltaje de 3 ~ 15V En las
líneas de control de RTS, CTS, DSR, DTR y DCD:
( 1) La señal es válida (estado ON) es un voltaje de 3 ~ 15V
(2) La señal no es válida (estado OFF) es un voltaje de -3 ~ -15V
Esto está regulado por el protocolo de comunicación RS-232.
RS-232: puerto serie estándar, la interfaz de comunicación serie más utilizada. Hay tres tipos (A, B y C), que utilizan diferentes voltajes para representar encendido y apagado. El más utilizado es RS-232C, que define el voltaje del bit de marca (encendido) entre -3V y -12V, y el voltaje de espacio (apagado) entre + 3V y + 12V. La distancia máxima de transmisión es de unos 15 metros y la velocidad máxima es de 20 kb / s. RS-232 está diseñado para comunicación punto a punto (es decir, solo un par de equipos de recepción y envío), y su carga de controlador es de 3-7 kΩ. Por tanto, RS-232 es adecuado para la comunicación entre dispositivos locales.
En segundo lugar, implemente la función printf para la depuración completa desde cero
- printf es una función de biblioteca estándar, la función es: imprimir (variable, cadena) y así sucesivamente.
Pregunta: ¿Puede escribir una función my_printf simple para depurar programas bare metal basada en el principio de printf? - Prototipo de función
//====================================================
//printf的声明
int printf(const char *format, ...);
//format:固定参数
//... :可变参数(变参)
- La función usa
los caracteres de formato en el ejemplo printf
- parámetro variable
1) Revisión del puntero en lenguaje c
2) Código: determinar manualmente los parámetros variables
① Llamada a funciónpush_test("abcd",123);
int push_test(const char *format, ...)
{
char *p = (char *)&format;
//参数1
printf("arg1 : %s\n",format);
//参数2
p = p + sizeof(char *);
i = *((int *)p);
printf("arg2 : %d\n",i);
...
}
② Llamada a función
struct person{
char *name;
int age;
char score;
int id;
};
struct person per={
"www.100ask.org",10,'A',123};
push_test("abcd",123,per);
¿Cómo implementar la push_test
función?
int push_test(const char *format, ...)
{
char *p = (char *)&format;
int i;
struct person per;
printf("arg1 : %s\n",format);
//==============
/*指针对连续空间操作时: 1) 取值 2)移动指针*/
p = p + sizeof(char *);
i = *((int *)p);
printf("arg2 : %d\n",i);
//==============
/*指针对连续空间操作时: 1) 取值 2)移动指针*/
p = p + sizeof(int);
per = *((struct person *)p);
printf("arg3: .name = %s, .age = %d, .socre=%c .id=%d\n",\
per.name, per.age, per.score, per.id);
}
③Debido a que en la plataforma x86 (máquina de 32 bits), el compilador GCC tiene por defecto una alineación de 4 bytes,
como por ejemplo: la estructura está alineada con 4 bytes, es decir, la dirección de memoria de la variable miembro de la estructura es un múltiplo entero de 4 .
El tamaño de alineación especificado se puede establecer usando la opción __attribute__ en gcc.
struct person{
char *name;
int age;
char score;
int id;
};
/*1):__attribute__ ((packed)),让所作用的结构体取消在编译过程中的优化对齐,
按照实际占用字节数进行对齐。
*/
struct person1{
char *name;
int age;
char score;
int id;
}__attribute__ ((packed));
/*2):__attribute((aligned (n))),让所作用的结构体成员对齐在n字节边界上。
如果结构体中有成员变量的字节长度大于n,则按照最大成员变量的字节长度来对齐。
*/
struct person2{
char *name;
int age;
char score;
int id;
}__attribute((aligned (4)));
④En el proceso de transferencia de parámetros de variables: los números de punto flotante se transfieren como variables dobles por defecto.
3) Código: determina automáticamente los parámetros variables