周老师,请教一下虚拟机中开发lvgl的上位机要实现按钮功能控制下位机开关,通过UART串口对应的ttyS3接口发送数据,我想先实现用这个串口给电脑上的串口助手发送数据,请问怎么实现有没有这部分代码示例呀,我之前只弄过单片机的串口没有碰过上位机的串口,自己研究几天了也没有弄明白。

这几天我搜索写的初始化串口是这样的:
#include “serial_main.h”

serial_handler_t *serial_handler;
void serial_init()
{
#if 0
if (serial_hander_init(ydt_handler, 0, 9600, 8, 0, 1) != SERIAL_SUCCESS) //使用通道一485口
{
printf(“serial_init error!\r\n”);
}
#else
if (serial_hander_init(&serial_handler, 1, 9600, 8, 0, 1) != SERIAL_SUCCESS) //使用通道二485口
{
printf(“serial_init error!\r\n”);
}
#endif
}

void serial_uinit(serial_handler_t *serial_handler)
{
serial_hander_uninit(serial_handler);
}

void *serial_send(char *text)
{
serial_status_t status = SERIAL_SUCCESS;
sprintf((char *)serial_handler->serial_frame_buff, text);
serial_handler->serial_frame_length = strlen((char *)serial_handler->serial_frame_buff);
serial_handler->frame_send(serial_handler); //发送数据
}

void *serial_recv(void)
{
serial_status_t status = SERIAL_SUCCESS;

status = serial_handler->frame_recv(serial_handler);
if (status == SERIAL_SUCCESS)
{
    printf("recv len = %d,recv=", serial_handler->serial_frame_length);
    for (int i = 0; i < serial_handler->serial_frame_length; i++)
    {
        printf("%c", serial_handler->serial_frame_buff[i]);  //打印接收到的数据
    }
}

}

int serial_main(int argc, char *argv[])
{

serial_init(&serial_handler);

#if 0
while (1)
{
serial_send(“123456789”);

    serial_recv();
    sleep(1);
}

#else
while (1)
{
sprintf((char *)serial_handler->serial_frame_buff, “123456789”);
serial_handler->serial_frame_length = strlen((char *)serial_handler->serial_frame_buff);
serial_handler->frame_send(serial_handler); //发送数据
serial_handler->frame_recv(serial_handler); //接收数据
sleep(1);
}
#endif
serial_uinit(serial_handler);
return 0;
}

这是写的按钮:
#include “app.h”
/事件函数/
void serial_btn_event_cb(lv_event_t * e){
/获取事件类型/
lv_event_code_t code = lv_event_get_code(e);
if (code == LV_EVENT_CLICKED){
serial_send(“123456”);
}
}

lv_obj_t * create_serial_btn(lv_obj_t * parent){
lv_obj_t * btn = lv_btn_create(parent);
lv_obj_center(btn);
lv_obj_add_event_cb(btn, serial_btn_event_cb, LV_EVENT_CLICKED, NULL);
}

串口功能头文件:
#ifndef _SERIAL_MAIN_H
#define _SERIAL_MAIN_H

#include “serial_mutex.h”
#include “serial_api.h”
#include “serial_define.h”
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <pthread.h>

/**

  • Serial port initialization
  • @param handler This is the struct pointer
  • @return no return value
    */
    void serial_init();

/**

  • Serial port uninitialization
  • @param serial port pointer
  • @return no return value
    */
    void serial_uinit(serial_handler_t *handler);

/**

  • Serial send data
  • @param what to send
  • @return no return value
    */
    void *serial_send(char *text);

/**
*print received content

  • @param NULL
  • @return no return value
    */
    void *serial_recv(void);

int serial_main(int argc, char *argv[]);

#endif

linux中串口其实就是文件,如果都是在一个系统中,可以这样操作:

fd = open("/dev/ttyf1", O_RDWR | O_NOCTTY | O_NDELAY);
 	if (fd == -1) {
	 	/*
	    * Could not open the port.
	    */
	    perror("open_port: Unable to open /dev/ttyf1 - ");
    } else {
    	fcntl(fd, F_SETFL, 0);
    }


n = write(fd, "100ask\r\n", 8);
if (n < 0) {
  	fputs("write() of 8 bytes failed!\n", stderr);
}

如果是不同系统,那么需要建立连接,一般是通过上位机建立与下面硬件的连接,这个时候需要串口库,这个库需要自己实现或者使用现成的。

我那个是不同系统的,所以我是不是还不能用这种
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <termios.h>

void create_layout(void){
int serila_port = open(“/dev/ttyS3”, O_RDWR);

strcut termios tty;
memset (&tty, 0, sizeof(tty));
if (tcgetattr(serila_port, &tty) != 0){
printf(“Error from tcgetattr: %s\n”, strerror(errno));
}

tty.c_cflag &= ~PARENB;
tty.c_cflag &= ~CSTOPB;
tty.c_cflag |= CS8;
tty.c_cflag |= CREAD | CLOCAL;

tty.c_cflag &= ~(ICANON | ECHO | ECHOE |ISIG);

tty.c_cc[VMIN] = 1;
tty.c_cc[VTIME] = 5;

cfsetospeed(&tty, B115200);
cfsetispeed(&tty, B115200);

if (tcsetattr(serila_port, TCSANOW, &tty) != 0){
printf(“Error from tcsetattr: %s\n”, strerror(errno));
}

//向串口发送数据
unsigned char msg[] = “hello ,world!”;
write(serila_port, msg, sizeof(msg));

close(serila_port);
}

如果你的上位机在linux系统中,那么单片机接上成功识别之后就会出现新的节点,比如:/dev/ttyS3,这个时候按照你发的这个代码进行通信也是可以的,后续建议找找linux平台上的第三方串口通信库进行

我大概明白一些了,谢谢周老师了