这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 活动中心 » 板卡试用 » 【BeagleBoneBlack】⑤作品提交:在线新闻阅读器

共1条 1/1 1 跳转至

【BeagleBoneBlack】⑤作品提交:在线新闻阅读器

助工
2026-04-23 21:43:35     打赏

上篇开启了node.js的大门,本篇就基于BeagleBoneBlack的硬件,完成一个在线新闻阅读器.


image.png


上图就是程序的总体功能。


第1步,配置串口。

BeagleBoneBlack上我们常用的串口有2个:

  1. USB虚拟串口,对应linux上的ttyGS0,用USB线插上电脑,就会 出现一个串口

    使用下面的命令就可以进行调试(波特率115200)

echo Hello > /dev/ttyGS0


如下图,就是我在调试新闻阅读器初期,先不接串口屏,直接USB连上开发板,实现串口输出新闻标题的功能。

image.png


2.    硬件串口,对应linux的ttyS0

也就是下图中的 Debug Serial Header(6针引脚J1),串行调试通过处理器上的UART0通过单一1x6引脚实现




UART.png


我们将串口屏的RXD与J1的第5针相连,串口屏的VCC(+5V)及GND与开发板的VCC(+5V)及GND连接。

 我使用的是一块迪文串口屏。关于他的具体使用方法,本篇就不具体赘述了。

使用迪文官方的软件,编辑好页面及文本控件(地址0x1000),然后将固件复制到SD卡中,再将SD卡插入串口屏,进而将固件下载至串口屏。

image.png


使用下面的2个指令,就可以测试串口屏配置是否正常:

# 配置串口:115200波特、8数据位、无校验、1停止位
sudo stty -F /dev/ttyS0 115200 cs8 -cstopb -parenb raw

# 发送完整十六进制指令
sudo echo -ne '\x5a\xa5\x10\x82\x10\x00\xb4\xba\xc3\xdf\xb2\xbb\xbe\xf5\xcf\xfe\xff\xff' > /dev/ttyS0


b58a4939ec841964424563260e355457.jpg

而其中最关键的指令

sudo echo -ne '\x5a\xa5\x10\x82\x10\x00\xb4\xba\xc3\xdf\xb2\xbb\xbe\xf5\xcf\xfe\xff\xff' > /dev/ttyS0


5a a5 10 82 10 00 B4 BA C3 DF B2 BB BE F5 CF FE FF FF

5a a5 是迪文串口屏的指令起始码

10 是起始码后面的指令数量= 文字内容长度+5

82 写指令

1000串口屏控件地址

B4 BA C3 DF B2 BB BE F5 CF FE 春眠不觉晓的GB2312码,每个汉字2个字节

FF FF结束指令

这样一看,除了文字内容,还有5个字节的指令(写指令:1个字节,控件地址:2个字节;结束指令:2个字节)


掌握了BeagleBoneBlack串口屏的驱动方法,我们就可以结合node.js来完成任务贴:在线新闻阅读器




直接贴出代码。



const https = require('https');
const { execSync, exec } = require('child_process');
const iconv = require('iconv-lite');

// ===================== 串口配置=====================
const SERIAL = "/dev/ttyS0";

// 1. 配置串口
try {
  console.log("配置串口:115200 8N1");
  execSync(`sudo stty -F ${SERIAL} 115200 cs8 -cstopb -parenb raw`);
} catch (e) {
  console.error("串口配置失败:", e);
}

// 2. 发送数据(二进制 GB2312)
function sendRaw(buffer) {
  return new Promise((resolve) => {
    const cmd = exec(`cat > ${SERIAL}`, { encoding: 'buffer' });
    cmd.stdin.end(buffer);
    cmd.on('close', () => {
      console.log("✅ 新闻已发送到 /dev/ttyS0 (迪文屏 GB2312)");
      resolve();
    });
    cmd.on('error', (err) => {
      console.error("发送数据失败:", err);
      resolve(); // 出错也resolve,避免定时器阻塞
    });
  });
}

// ===================== 抓取新闻 + 转 GB2312 + 迪文屏格式 =====================
async function fetchAndSend() {
  try {
    console.log(`\n开始抓取新闻 [${new Date().toLocaleString()}]`);
    https.get('https://www.zaobao.com/', {
      headers: { 'User-Agent': 'Mozilla/5.0' }
    }, (resp) => {
      let html = '';
      resp.on('data', (d) => html += d);
      resp.on('end', async () => {
        let titles = [];
        let reg = /<a[^>]+href="[^"]+"[^>]*>([^<]+)<\/a>/g;
        let m;

        while ((m = reg.exec(html)) !== null) {
          let t = m[1].trim();
          if (t.length > 6 && t.length < 40) titles.push(t);
        }

        // 去重,取前5条
        let news = [...new Set(titles)].slice(0,5);
        let text = "--- 联合早报实时新闻 ---\n";
        news.forEach((item, i) => {
          text += `${i+1}. ${item}\n`;
        });

        // 转 GB2312(迪文屏专用)
        let gbBuf = iconv.encode(text, "gb2312");
        
        // 迪文屏指令头 5A A5 05 82 1000(写文本区)
        let header = Buffer.from([0x5A, 0xA5, gbBuf.length + 2, 0x82, 0x10, 0x00]);
        let final = Buffer.concat([header, gbBuf]);

        await sendRaw(final);
      });
    }).on('error', (err) => {
      console.error("请求联合早报失败:", err);
    });
  } catch (e) {
    console.error("抓取/发送新闻总错误:", e);
  }
}

// 立即执行一次(启动时)
fetchAndSend();

// 每小时执行一次(3600000 毫秒 = 1小时)
const interval = 3600 * 1000;
setInterval(fetchAndSend, interval);

console.log("========================================");
console.log("  迪文屏新闻发送服务已启动");
console.log("  串口:/dev/ttyS0  115200 8N1");
console.log("  编码:GB2312");
console.log(`  刷新周期:每 ${interval/1000/60} 分钟`);
console.log("========================================");


需要说明,首先要安装2个node软件包

sudo npm install serialport
sudo npm install iconv-lite


第一个serialport软件包,实现node与串口的交互

第二个iconv-lite软件包,实现UTF-8转GB2312,因为node从网页上提取的内容,默认是UTF-8编码的,迪文串口屏只支持GB2312或者unicode,只好把内容由UTF-8转GB2312。

另外,是设置了每小时刷新(抓取)一次,以便获取最新消息。

运行结果如下图:

文字部分有些错行,后面再摸索了。

6310debf23de6bd5ea08f6422e8d5784.jpg


为了使其功能更完备,我增加了开启自启动功能,使其脱离电脑,更像一个产品:在线新闻阅读器

方法如下:

1.    编辑服务文件

    sudo nano /etc/systemd/system/dwin-news.service

    将以下内容copy进去

[Unit]
Description=迪文屏自动新闻刷新服务
After=network.target dev-ttyS0.target

[Service]
Type=simple
User=root
WorkingDirectory=/home/beagle
ExecStart=/usr/bin/node /home/beagle/news-dwin-align.js
Restart=always
RestartSec=15

[Install]
WantedBy=multi-user.target

2. 激活并启用开机启动

sudo systemctl daemon-reload
sudo systemctl enable --now dwin-news.service

3. 查看运行状态

sudo systemctl status dwin-news.service


后续开机就可以看到最新的新闻了。

本次作品分享就到这里。




共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]