1 回答
TA贡献2080条经验 获得超4个赞
你可以通过使用时间自动收报机和上下文来实现
func read_serial_port(c context.Context){
c := &serial.Config{Name:"/dev/ttyACM0", Baud:9600}
s, err := serial.OpenPort(c)
if err != nil {
log.Fatal(err)
}
filename:= randSeq(10)+".txt"
file, _ := os.Create("output/"+filename)
defer file.Close();
ticker := time.NewTicker(100 * time.Millisecond)
defer ticker.Stop()
for{
select {
case <-c.Done():
break
case <-ticker.C:
buf := make([]byte, 128)
n, err := s.Read(buf)
if err != nil {
log.Fatal(err)
}
log.Printf("%s", string(buf[:n]))
fmt.Fprintf(file, string(buf[:n]))
time.Sleep(100 * time.Millisecond)
}
}
}
然后你需要添加另一条路线来调用取消功能
if r.FormValue("action") == "add"{
c, cnl := context.WithCancel(context.Background())
// need to access this cancel function to use it in another route
ExportedFunction = cnl
go read_serial_port()
}
然后通过以下方式取消它:
func abortingMission(w http.ResponseWriter, r *http.Request) {
ExportedFunction()
}
也不要在你的函数名中使用下划线
- 1 回答
- 0 关注
- 92 浏览
添加回答
举报