赞
踩
案例 运行任务 传一个参数进去 这个任务时死循环 希望running的时候还可以修改这个参数
不可以的
- package main
-
- import (
- "fmt"
- "time"
- )
-
- func main() {
- var num int = 4
- go m_ble_task(num)
-
- time.Sleep(3 * time.Second)
- num = 5
- time.Sleep(3 * time.Second)
- }
- func m_ble_task(conn_limit int) {
- for {
- time.Sleep(1 * time.Second)
- fmt.Println(conn_limit)
- }
- }

[Running] go run "c:\Users\Koson.Gong\Desktop\sgo\pack.go"
4
4
4
4
4
传入地址
可以的
- package main
-
- import (
- "fmt"
- "time"
- )
-
- func main() {
- var num int = 4
- go m_ble_task(&num)
-
- time.Sleep(3 * time.Second)
- num = 5
- time.Sleep(3 * time.Second)
- }
- func m_ble_task(conn_limit *int) {
- for {
- time.Sleep(1 * time.Second)
- fmt.Println(*conn_limit)
- }
- }
-
-
- [Running] go run "c:\Users\Koson.Gong\Desktop\sgo\pack.go"
- 4
- 4
- 4
- 5
- 5
-

补充简单
- package main
-
- import (
- "fmt"
- "time"
- )
-
- var num int = 4
-
- func main() {
-
- go m_ble_task()
-
- time.Sleep(3 * time.Second)
- num = 5
- time.Sleep(3 * time.Second)
- }
- func m_ble_task() {
- for {
- time.Sleep(1 * time.Second)
- fmt.Println(num)
- }
- }

补充一个简单的方式
[Running] go run "c:\Users\Koson.Gong\Desktop\sgo\pack.go"
4
4
5
5
5
全局变量
我的操作时
ota.Mask = 0 --关闭了
for {
if (len(connected) < *conn_limit) && (len(connected) < ota.Mask) { 在使用的时候变化
Mask = 100 还原出去
+++++++继续
问题:树莓派做蓝牙主机 连接从机时候 以后 断开时从机的行为
不是树莓派主机主动去断开的
目前没有断开的回调函数(可以考虑自己开发)
那么我需要一个任务去监听断开(先这么做吧)
补充一个案例:主机-扫描-连接--打印连接状态
方式1 台湾
AA-------
func ble_on_disconnect(a *bluetooth.Adapter, result bluetooth.ScanResult, c chan bool) {
for {
connected, _ := a.Connected(result.Address)
if !connected {
log.Printf("[BLE][%s] on disconnected\r\n", parse_MAC(result))
c <- false // ble disconnect
return
}
time.Sleep(500 * time.Millisecond)
}
}
BB-----mian里面
ble_close := make(chan bool, 1)
go ble_on_disconnect(adapter, result, ble_close)
select {
case <-ble_close:
打印连接状态
break
也即是做了一个死循环轮询 一个通道返回消息
接口是自己写的
D:\QMDownload\bluetooth_mcube\gap_linux.go
func (a *Adapter) Connected(address Addresser) (bool, error) {
adr := address.(Address)
devicePath := dbus.ObjectPath(string(a.adapter.Path()) + "/dev_" + strings.Replace(adr.MAC.String(), ":", "_", -1))
dev, err := device.NewDevice1(devicePath)
if err != nil {
return false, err
}
return dev.Properties.Connected, nil
}
方式2 参考:LED的代码
func main() {
println("starting")
led.Configure(machine.PinConfig{Mode: machine.PinOutput})
neo.Configure(machine.PinConfig{Mode: machine.PinOutput})
ws = ws2812.New(neo)
adapter.SetConnectHandler(func(d bluetooth.Addresser, c bool) {
connected = c
if !connected && !disconnected {
clearLEDS()
disconnected = true
}
if connected {
disconnected = false
}
})
它的意思是这样的
2个全局变量
其中disconnected一直是我自己控制
另外一个connected一直不归我自己控制 而是丢给后台 让程序自己控制
一开始两个都是0 进到第一个if所以disconnected=1标识没有连接
一旦连接 也就是后台程序设置了 connected=1 我进第二个if disconnected=0
再次断开连接 那就近代第一个if
关注一个和后台的桥梁回调函数 SetConnectHandler
- package main
-
- import (
- "fmt"
- "time"
- )
-
- /*
- 定义一个结构体 成员1是string 成员2是一个函数需要参数bool没有返回值
- */
- type Adapter struct {
- id string
- connectHandler func(connected bool)
- }
-
- /*
- 实例化一个出来 现场赋值第二个成员
- */
- var DefaultAdapter = &Adapter{
- connectHandler: func(connected bool) {
- fmt.Println("connectHandler I am here")
- return
- },
- }
-
- /*
- 结构体绑定一个方法 它是修改里面的函数的!
- */
- func (a *Adapter) SetConnectHandler(c func(connected bool)) {
- a.connectHandler = c
- }
- func myswap(c bool) {
- go func(b bool) {
- for {
- time.Sleep(time.Second * 2)
- fmt.Println("myswap", b)
- b = !b
- }
- }(c)
- }
-
- func main() {
- tt := true
- count := 0
- var m_adapter = DefaultAdapter
- m_adapter.id = "HCI2"
- fmt.Println(m_adapter)
- m_adapter.connectHandler(tt) //调用1
- /*
- 第一轮测试
- &{HCI2 0x1fc6a0}
- connectHandler I am here
- */
- m_adapter.SetConnectHandler(func(c bool) {
- fmt.Println("new boy!")
- })
- fmt.Println(m_adapter)
- m_adapter.connectHandler(tt) //调用2
- /*
- 上面是经过SetConnectHandler以后第二轮测试
- &{HCI2 0x1fc720}
- new boy!
- */
- m_adapter.SetConnectHandler(myswap)
- fmt.Println(m_adapter)
- m_adapter.connectHandler(tt) //调用3
- for {
- time.Sleep(time.Second)
- fmt.Println(tt)
- count++
- if count == 8 {
- break
- }
- }
- /*
- 上面是经过SetConnectHandler以后第三轮测试
- myswap false
- true
- 函数内的bool已经翻转 凡是不能带出来 tt不变化
- 因为这里是值 不是地址
- */
- /*
- 前面的模仿没有到位
- 应该是这个结构体 给一个bool标识状态 即可
- 但是结构体给的不是bool 而是一个函数
- 应该是后台有函数在设置的 我送bool进去
-
- 源码// TODO: a proper async callback.
- m_adapter.connectHandler(nil, true)
-
-
- */
- fmt.Println("wrong--->right")
- /*后台设置函数 */
- go func() {
- b := true
- for {
- time.Sleep(time.Second * 2)
- b = !b
- fmt.Println("background", b)
- m_adapter.connectHandler(b)
- }
-
- }()
-
- /*用户设置函数 */
- m_adapter.SetConnectHandler(func(c bool) {
- tt = c
- })
- /*主程序打印 看到后台的修改 传过来了*/
- for {
- time.Sleep(time.Second)
- fmt.Println(tt)
- count++
- if count == 8 {
- break
- }
- }
-
- }

这个是后台传给前台---给的是api函数
本文前面我们把数据传进去 是前台传给后台
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。