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

上图就是程序的总体功能。
第1步,配置串口。
BeagleBoneBlack上我们常用的串口有2个:
USB虚拟串口,对应linux上的ttyGS0,用USB线插上电脑,就会 出现一个串口
使用下面的命令就可以进行调试(波特率115200)
echo Hello > /dev/ttyGS0
如下图,就是我在调试新闻阅读器初期,先不接串口屏,直接USB连上开发板,实现串口输出新闻标题的功能。

2. 硬件串口,对应linux的ttyS0
也就是下图中的 Debug Serial Header(6针引脚J1),串行调试通过处理器上的UART0通过单一1x6引脚实现


我们将串口屏的RXD与J1的第5针相连,串口屏的VCC(+5V)及GND与开发板的VCC(+5V)及GND连接。
我使用的是一块迪文串口屏。关于他的具体使用方法,本篇就不具体赘述了。
使用迪文官方的软件,编辑好页面及文本控件(地址0x1000),然后将固件复制到SD卡中,再将SD卡插入串口屏,进而将固件下载至串口屏。

使用下面的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

而其中最关键的指令
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。
另外,是设置了每小时刷新(抓取)一次,以便获取最新消息。
运行结果如下图:
文字部分有些错行,后面再摸索了。

为了使其功能更完备,我增加了开启自启动功能,使其脱离电脑,更像一个产品:在线新闻阅读器
方法如下:
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
后续开机就可以看到最新的新闻了。
本次作品分享就到这里。
我要赚赏金
